1

我有一个服务,它有一个内部指令名称列表(让我们称之为listService)。本着松散耦合应用程序的精神,我希望其他模块能够将它们自己的指令添加到该列表中,而不是在服务模块中静态定义它。

我知道我可以创建一个提供程序来配置这样的服务:

app.provider("listService", ServiceProvider);

app.config(["listServiceProvider", function(listServiceProvider) {
    listServiceProvider.add("myDirective");
}]);

同时,我不希望所有定义指令的模块都依赖于服务。所以我想做的是“如果在这个项目中使用了这个服务:配置它;否则:忽略”。

不幸的是,如果上面的代码不可用,则会产生模块错误。listServiceProvider我还尝试使用具有相同结果的装饰器。

那么我怎样才能有选择地配置服务以获得松散耦合的应用程序呢?

4

2 回答 2

0

就像我在评论中提到的那样,重要的是要了解为什么需要注册指令(或其名称)的更广泛背景。

如果没有更广泛的理解,一般来说,如果您需要有条件地检查服务(或服务提供者,在配置中)的存在,您可以使用$injector

.config(function($injector){
   var listServiceProvider;
   if ($injector.has("listServiceProvider")) {
     listServiceProvider = $injector.get("listServiceProvider");
   }

   if (listServiceProvider){
     listServiceProvider.add("myDirective");
   }
});
于 2015-03-10T13:48:53.973 回答
0

如果我理解正确;您需要一个服务来跟踪您的哪些指令已添加到 Angular 应用程序中,并将指令和服务相互分离,以便可以按需包含它们。

我认为模块模式不会为您执行此操作,因为服务和指令是在加载时注入的。可选的依赖注入是不可能的。

但是,您可以从指令中触发一个事件并在您的服务中获取它,从而完全不需要依赖注入。

我的指令

.run(['$rootScope', 'LIST_SERVICE_EVENT', 
          function($rootScope, LIST_SERVICE_EVENT) {
    $rootScope.$emit(LIST_SERVICE_EVENT, 'myDirective');
}]);

列表服务

.run(['listService', '$rootScope', 'LIST_SERVICE_EVENT', 
        function(listService, $rootScope, LIST_SERVICE_EVENT) {
    $rootScope.$on(LIST_SERVICE_EVENT, function(ev, name) {
        listService.add(name);
    });
}]);

小提琴:http: //jsfiddle.net/bdpxhLg3/4/

于 2015-03-10T17:51:03.523 回答