当您以角度重新声明现有指令时会发生什么?

时间:2015-12-23 18:43:05

标签: angularjs angularjs-directive

问题来自阅读this source code。在第7行重新宣布ngModel时会发生什么?即使新的ngModel工作,预先存在的.Bottom如何继续发挥作用?

我希望了解角度框架对指令的作用,以及该行为如何实现这种重新声明。

1 个答案:

答案 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,可能会归结为您如何定义“扩展”。