检查是否存在Angular指令

Mon*_*y34 21 javascript angularjs

我们在Angular项目中围绕动态指令做了很多工作,有一件事是作为一个有用的东西,有一种通用指令可以列出许多不同类型的类似对象(例如,消息) ,用户,评论等),通过委托基于对象类型的特定指令.

我们称之为object-list指令,如果我们能够正常工作,它将有希望委托给许多不同的指令.

我们需要解决的主要问题是object-list我们的系统中是否存在提供该指令的指令.我们检查这个的方法是发出一个$compile针对target指令,将它链接到一个作用域,并检查它的HTML内容(例如var tmpElement = $compile('<div my-message'></div>')(scope);).当template选项引用目标指令的模板时,这似乎有效,但是当我们改为指向a时templateUrl,HTML内容为空.

这是一个Plunker,templateUrl方法到位(不工作).您可以将其注释掉并取消注释该template行以查看警报显示.

http://plnkr.co/edit/wD4ZspbGSo68v4eRViTp

有没有其他方法来检查指令的存在?我承认,这似乎有点像黑客.

Buu*_*yen 52

您可以$injector.has用来检查提供者或实例是否存在.

app.directive('objectList', function ($compile, $injector) {
  return {
    template: 'OK',
    link: function (scope, element, attrs) {
      var exist = $injector.has('myMessageDirective');
      ...
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

  • 它应该是`$ injector.has('myMessageDirective')`,而不是`$ injector.has('myMessage')`.(为什么?因为$ compile服务在注册任何指令时添加了"Directive"后缀.)工作plunker:http://plnkr.co/edit/n1XX6cgvZ4o6eVGhj4aO?p = preview (20认同)
  • 谢谢你的回应,Buu.不幸的是,它看起来不像这样.`$ injector.has()`方法的文档声明它仅用于服务查找.此外,尝试我的Plunker(在这里更新http://plnkr.co/edit/owHeruUXmfxFSE1klv7S)无法给我我正在寻找的结果. (3认同)
  • 啊啊,我现在看到了.谢谢,Buu! (3认同)