在Angular中两次声明相同指令的目的是什么?

时间:2014-02-26 18:38:37

标签: angularjs angularjs-directive

在根据我的需要重写ng-include时,我发现直接ngIncludeFillContentDirective,声明为ng-include,如:

.directive({ngInclude: ngIncludeDirective}).directive({ngInclude: ngIncludeFillContentDirective})

您可以看到ngInclude source here。您可以看到上面here调用的指令方法。

那么,它对实际指令的影响到底是什么?它只是作为另一个指令应用吗?它有特殊意义吗?

2 个答案:

答案 0 :(得分:3)

您可以对多个指令使用相同的名称,如果您查看ngInclude ngInclude.js的源代码,您将看到所有指令都具有优先级属性。第一个是400,最后一个是-400。优先级实际上表示执行相同名称但不同优先级的指令的顺序。

您甚至可以出于某种原因附加您的指令,但添加较低的优先级以确保它呈现所需的。虽然不建议覆盖原生ng指令。

答案 1 :(得分:1)

second link正在展示核心角度指令的编译。编译提供程序使用.directive

构建的$provide.provider('$compile', $CompileProvider).函数

您的第一个链接显示ngIncludengIncludeFillContentDirective的声明。您可以在ngIncludeFillContentDirective上看到ngInclude 取决于

我很确定在编译期间,ngInclude需要在编译ngIncludeFillContentDirective之前先编译。

所以,我相信这与.directive链接在一起,以便按照正确的顺序排序编译过程并构建依赖项。

修改
所以,$CompileProviderdirective。此对象上有一个名为forEach(name, reverseParams(registerDirective)); 的函数。这是OP中调用的函数。

您可以看到,如果参数不是字符串,则在参数对象上调用此行:

forEach

这主要使用forEach来迭代参数对象的属性。 iterator.call(context, obj[key], key); 将键从对象中拉出,然后执行此操作:

ngInclude

因此,它只使用密钥的

我认为这归结为对象中的属性名称(因此,{ngInclude: ngIncludeFillContentDirective}中的ngIncludeFillContentDirective)必须是唯一的。属性({{1}})的值是注册的。

所以,似乎没有任何特殊含义。至少没有我能找到的。