如何使 Angular 指令只能由一个组件使用?

Posted

技术标签:

【中文标题】如何使 Angular 指令只能由一个组件使用?【英文标题】:How do I make an Angular directive usable only by one component? 【发布时间】:2018-08-23 12:46:18 【问题描述】:

我知道能够使用我的指令的唯一方法是在模块中导出它。

@NgModule(
  imports: [
    CommonModule
  ],
  declarations: [BreadcrumbsComponent, IsRightDirective],
  exports: [BreadcrumbsComponent, IsRightDirective]
)
export class BreadcrumbsModule  

我的 BreadcrumbsModule 是由我的 AppModule 导入的

@NgModule(
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    BreadcrumbsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
)
export class AppModule  

现在,当我使用我将选择器命名为bulma-breadcrumbs 的面包屑组件并添加属性is-right 时,它按预期工作。但是,如果我将它添加到另一个标签,例如 h1,该指令也会影响它。

我试图让指令仅适用于BreadcrumbsComponent

【问题讨论】:

【参考方案1】:

只有当元素tagNamebulma-breadcrumbs时,才能使指令生效:

export class IsRightDirective 

  constructor(private elementRef: ElementRef) 
    let element = elementRef.nativeElement as htmlElement;
    if (element.tagName.toLowerCase() === "bulma-breadcrumbs") 
      element.style.border = "solid 4px red";
      ...
    
  


有关代码的工作示例,请参阅 this stackblitz

【讨论】:

【参考方案2】:

在 Angular 2 RC5 之前,指令/组件的层次结构是透明的,因为组件具有 directives 属性,该属性定义了仅影响该组件及其子组件的组件/指令。

在引入NgModule 后,此功能保持不变,但变得不那么明显了。正如this answer 中所解释的,使用适当的模块层次结构是可能的。

大多数时候模块declarationsexports 是相同的,这允许在应用程序中全局使用模块指令、组件和管道。

如果一个单元不是从一个模块中导出的,它只能在本地使用,对同一模块中的其他单元可用。

这个

@NgModule(
  imports: [
    CommonModule
  ],
  declarations: [BreadcrumbsComponent, IsRightDirective],
  exports: [BreadcrumbsComponent]
)
export class BreadcrumbsModule  

将阻止 is-right 属性指令在此模块声明之外的任何地方编译(即 BreadcrumbsComponent)。

或者,指令selector 可以限制为bulma-breadcrumbs[is-right]。结果将是相同的,但这不会阻止该指令在具有其本地 bulma-breadcrumbs 组件的其他模块中使用。

【讨论】:

感谢您的详细描述,我完全错了。我不明白导出是为了在其他模板中使用。很高兴知道。我也喜欢如何让选择器只用于元素。正是我正在寻找的。每个带有 is-right 的 bulma-breadcrumbs 元素。 :) 谢谢!

以上是关于如何使 Angular 指令只能由一个组件使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 中的依赖注入将属性指令实例传递给嵌套组件

Angular如何将数据从指令传递到父组件

如何使用多个选择器定义 Angular 2 组件或指令

在 Angular 结构指令中使用动态组件会产生额外的 HTML 标记。如何删除或更换它?

Angular 模块封装概念常见的错误理解

angular2 指令可以访问它所应用的组件的模板吗?