自定义和内置directve之间的优先级



我正在阅读ng-book-r27

有些事情我不能很好地理解。

关于"解释的指令"一章的"范围选项"。

第一个困惑:

如果一个元素上的多个指令提供了隔离作用域,则仅应用了一个新的范围。的模板中的根元素指令总是得到一个新的范围;因此,对于这些对象,范围是默认情况下设置为true。

我认为这意味着其他指令将使用隔离范围作为它们的范围。是这样吗?

第二个困惑:

继承范围示例

ng init的优先级高于自定义指令。为什么ng init的表达式将使用自定义目录的作用域。

我从官方文档中找到了一个关于ng init:的建议

此指令可能会被滥用,从而在您的模板。ngInit只有几种适当的用法,例如至于ngRepeat的混叠特殊属性,如演示中所示在下面以及用于经由服务器端脚本注入数据。除了这些在少数情况下,应该使用控制器而不是ngInit进行初始化作用域上的值。

好吧,我可以忽略第二次混淆的奇怪行为。

我没有读过《ng-book》一书,但据我所知,您第一次混淆的陈述与AngularJS文档中关于指令中继承和隔离作用域的内容不一致。

上面的语句根本不可能,如果有多个指令,每个指令都有自己的isolated作用域,则会产生$compile:multir错误。这是演示

.directive('elem1', function($rootScope) {
  return {
    restrict: 'A',
    scope: {}
  };
})
.directive('elem2', function() {
  return {
    restrict: 'A',
    scope: {}
  }
});

扫描AngularJS文档后,没有任何支持语句可以验证该语句:

如果一个元素上的多个指令提供了隔离作用域,则仅应用了一个新的范围。

我看到的与上面的语句相似的最接近的语句是创建指令时的scope: true选项定义:

true:一个新的子作用域,原型继承自其父作用域将为指令的元素创建。如果上有多个指令同一个元素请求一个新的作用域,只创建一个新作用域。新的作用域规则不适用于模板的根,因为模板的根总是得到一个新的作用域。

上面的语句表明,当带有scope: true选项的多个指令(而不是一个独立的作用域)驻留在一个元素中时,它将创建一个作用域,而其他所有指令都是一个共享作用域演示

.directive('elem1', function($rootScope) {
  return {
    restrict: 'A',
    scope: true,
    link: function(scope) {
      console.log(scope.hello);
    }
  };
})
.directive('elem2', function() {
  return {
    restrict: 'A',
    scope: true,
    link: function(scope) {
      scope.hello = 'world';
      console.log(scope.hello);
    }
  }
});

您会注意到,这两个指令都记录了'world',这显然支持上面的语句。


如果您在$compile scope AngularJS文档中阅读更多内容,您会看到:

一般来说,可以对一个指令应用多个指令元素,但根据作用域的类型可能会有限制指令要求。以下几点将有助于解释这些限制。为了简单起见,只考虑了两个指令帐户,但它也适用于几个指令:

无作用域+无作用域=>两个不需要自己作用域的指令将使用其父作用域

子作用域+无作用域=>两个指令将共享一个子作用域

子作用域+子作用域=>两个指令将共享一个子作用域

隔离作用域+无作用域=>隔离指令将使用自己创建的隔离作用域。另一个指令将使用其父指令的作用域

孤立作用域+子作用域=>不起作用只有一个作用域可以与一个元素相关。因此,这些指令不能应用于同一个元素。

孤立作用域+孤立作用域=>无效!只有一个作用域可以与一个元素相关。因此,这些指令不能应用于同一个元素。

也许您在识别原型固有作用域和隔离作用域之间的差异时遇到了问题。您可能需要阅读$rootScope.Scope $new()方法,即isolate参数定义。

第一个问题:

我认为这意味着其他指令将使用隔离范围作为他们的是这样吗?

答案是绝对否定的,对于具有隔离作用域的多个指令,它将产生$copile:multidir错误。

对于您的第二个问题:

ng init的优先级高于自定义指令。为什么表达的init将使用自定义指令的作用域?

对于没有独立作用域的指令或原型上没有从其父作用域继承的指令,您可以将这些指令直接关联为具有scope属性定义和虚假作用域值:

falsy:不会为指令创建任何作用域。该指令将使用其父范围

如果一个指令绑定到一个有自己作用域的元素,那么它只使用该元素的作用域,否则它会查找作用域链中的所有作用域实例,直到到达$rootScope

最新更新