Angular:可选择配置服务

时间:2015-03-09 18:08:43

标签: angularjs angularjs-provider

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

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

app.provider("listService", ServiceProvider);

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

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

不幸的是,如果listServiceProvider不可用,上面的代码会产生module error。我还试图使用decorator得到相同的结果。

那么我如何可选配置服务以便拥有松散耦合的应用程序?

2 个答案:

答案 0 :(得分:0)

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

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

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

   if (listServiceProvider){
     listServiceProvider.add("myDirective");
   }
});

答案 1 :(得分:0)

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

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

但是,你可以从你的指令中激活一个事件并在你的服务中提取它,完全不需要依赖注入。

myDirective

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

listService

.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/