我有一个服务,它有一个指令名称的内部列表(让我们称之为listService
)。本着松耦合应用程序的精神,我希望其他模块能够将自己的指令添加到该列表中,而不是在服务模块中静态定义它。
我知道我可以创建一个提供程序来配置这样的服务:
app.provider("listService", ServiceProvider);
app.config(["listServiceProvider", function(listServiceProvider) {
listServiceProvider.add("myDirective");
}]);
同时,我不希望所有定义指令的模块都依赖于服务。所以我想做的是#34;如果在这个项目中使用这个服务:配置它;否则:忽略"。
不幸的是,如果listServiceProvider
不可用,上面的代码会产生module error。我还试图使用decorator得到相同的结果。
那么我如何可选配置服务以便拥有松散耦合的应用程序?
答案 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);
});
}]);