问题来自阅读this source code。在第7行重新宣布ngModel
时会发生什么?即使新的ngModel
工作,预先存在的.Bottom
如何继续发挥作用?
我希望了解角度框架对指令的作用,以及该行为如何实现这种重新声明。
答案 0 :(得分:2)
如果您注册两个具有相同名称的指令,则第二个指令不会重新声明旧指令,也不会添加它。简单地说两个不同的指令具有相同的名称。
考虑添加三个名为test
的指令。如果要检查队列,则将它们推入到队列中,它存储在模块对象的_invokeQueue
属性中。
执行以下操作:
<pre>{{ app._invokeQueue | json }}</pre>
将生成:
[
[
"$compileProvider",
"directive",
{
"0": "test"
}
],
[
"$compileProvider",
"directive",
{
"0": "test"
}
],
[
"$compileProvider",
"directive",
{
"0": "test"
}
]
]
如果你console.log(app._invokeQueue)
,你可以进一步检查。
演示: http://plnkr.co/edit/xzz7ASHYNUxk71QaJTQV?p=preview
该演示还显示了编译,预链接和后连接函数的执行顺序(检查控制台)。
如果你添加一个名为ngModel
的自定义指令,这两个指令可以过自己的生命,但你仍然“扩展”原始指令,至少在一种方式。
如果您有以下内容:
<input ng-model="viewModel.person" />
这两个指令都将被执行,你已经“扩展”了ng-model的行为。
然后添加一个事实,即您的自定义ngModel
指令可以要求并访问原始ngModel
指令的控制器,您将获得有关如何影响原始行为的更多选项。
如果您可以扩展原始ngModel
,可能会归结为您如何定义“扩展”。