22

我们在 Angular 项目中围绕动态指令做了大量工作,其中一个很好的方法是拥有一个通用指令,该指令可以列出许多不同类型的相似对象(例如,消息,用户,评论等),通过根据对象的类型委托给特定的指令。

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

我们需要解决的主要问题是object-list我们的系统中是否存在已提供该指令的指令。我们一直在检查这一点的方法是$compile针对 target 指令发出一个,将其链接到一个范围,并检查其 HTML 内容(例如,var tmpElement = $compile('<div my-message'></div>')(scope);)。This seems to work when the template for the target directive is referenced by the templateoption, but when we instead try to point to a templateUrl, the HTML contents are empty.

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

http://plnkr.co/edit/wD4ZspbGSo68v4eRViTp

有没有另一种方法来检查指令的存在?我承认,这似乎有点骇人听闻。

4

1 回答 1

52

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

app.directive('objectList', function ($compile, $injector) {
  return {
    template: 'OK',
    link: function (scope, element, attrs) {
      var exist = $injector.has('myMessageDirective');
      ...
    }
  };
});
于 2013-09-12T02:15:53.330 回答