我们在Angular项目中围绕动态指令做了大量的工作,并且有一件事是一个很好的方法,有一个通用指令可以列出许多不同类型的类似对象(例如,消息,用户,评论等),通过根据对象的类型委托给特定的指令。
我们称这个指令为object-list
,如果我们能够正常工作,它将有希望委托给许多不同的指令。
我们需要解决的主要问题是我们的系统中是否存在已提供此object-list
指令的指令。我们检查这种方法的方法是针对目标指令发出$compile
,将其链接到范围,并检查其HTML内容(例如var tmpElement = $compile('<div my-message'></div>')(scope);
)。当template
选项引用目标指令的模板时,这似乎有效,但当我们尝试指向templateUrl
时,HTML内容为空。
这是一个Plunker,templateUrl
方法到位(不工作)。您可以对其进行评论并取消注释template
行以查看警报显示。
http://plnkr.co/edit/wD4ZspbGSo68v4eRViTp
还有另一种检查指令是否存在的方法?我承认,这确实有点像黑客。
答案 0 :(得分:52)
您可以使用$injector.has
检查提供商或实例是否存在。
app.directive('objectList', function ($compile, $injector) {
return {
template: 'OK',
link: function (scope, element, attrs) {
var exist = $injector.has('myMessageDirective');
...
}
};
});