2015-12-21 49 views
17

我正在开发一个Angular2应用程序。我需要特殊的行为添加到各个环节因此在角1.xi只想写一个这样的指令:在angular2全局注册一个指令

angular.module('whatever.module', []).directive('href', function() { 
    return { 
     restrict: 'A', 
     link: function($scope, $element, $attrs) { 
      // do stuff 
     } 
    }; 
}); 

在angular2我可以写这样的指令:

@Directive({ 
    selector: '[href]', 
}) 

export class MyHrefDirective { 
    constructor() { 
     // whatever 
    } 
} 

但是,如何在我可以告诉应用程序在全球范围内使用该指令吗?我有很多关于他们的链接的观点。我是否必须导入它并在directives数组中指定它(每个组件都很多)?

我想它注入到bootstrap功能就像你应该用服务做在全球拥有一个实例,但没有工作

+0

我想如果你提供你的指令globaly我的意思是在Bootstraping根组件的时候,那么不需要导入每个人的数组 –

+0

如果你已经读过我的问题中的最后一句话,你会知道我已经尝试过了。 – kamilkp

回答

30

我的理解是,你必须选择加入到所有自定义指令在组件级别。只隐含包含PLATFORM_DIRECTIVES(ngFor,ngIf等)。

然而,你可以作为一个PLATFORM_DIRECTIVE

import { provide, PLATFORM_DIRECTIVES } from '@angular/core'; 

bootstrap(RootCmp, [ 
    provide(PLATFORM_DIRECTIVES, {useValue: YourCustomDirective, multi: true}), 
]); 

这里自己的自定义指令寄存器是更多地谈论过程中的文章: http://blog.thoughtram.io/angular2/2015/11/23/multi-providers-in-angular-2.html

编辑: 我认为这不太关注现在,因为组件是在模块级声明的。这意味着重复次数会减少很多,因为您不再需要在各个组件级别声明子组件。

+1

谢谢。这是一个很好的回答,我没有意识到这一点。奇迹般有效。 – kamilkp

+1

注意:像'HTTP_PROVIDERS'这样的' _PROVIDERS'可以直接传递给列表,而所有的指令都必须使用'provide(..)'作为参数传递给TGH。它不需要是一个自定义指令,但是即使是基于外部npm库的指令,如来自material2库的指令也必须以这种方式传递到引导函数中。 –

+1

可能想更新此答案,因为它不再是关卡 –