javascript - Angular 如何处理具有多个指令的元素

标签 javascript angularjs

如果一个元素有多个指令,一个使用 scope:false,一个使用 scope:true,一个使用 scope:{}, Angular 是如何处理这个元素的?

最佳答案

如果您在同一元素上包含所有三个要求所有三个范围选项的指令,则会出现错误。 truefalse 兼容并使用相同的范围,但添加 {} 会导致:

Error: [$compile:multidir] Multiple directives [isolatedScope, trueScope]
asking for new/isolated scope on:
<div false-scope="" true-scope="" isolated-scope="">

在这种情况下,true{} 会在 true 尝试创建新的继承范围和 {} 时发生冲突 尝试创建一个新的、独立的范围,这是合理的,也许是预期的。 $compile docs说:

If multiple directives on the same element request a new scope, only one new scope is created.

如果您有多个带有 scope: true 的指令,它们很好,您只得到一个,但是 scope: {} 要求另一种,而 Angular不能同时产生。指令可以声明为 priority,因此他们可以悄悄地选出获胜者,但这会导致各种意外,因此他们明智地决定大声疾呼。


这是 a Plunker证明它。我将所有三个作用域放在一个 div 上,然后使用父作用域中可用的数据在每个作用域中声明数据。如果您注释掉 scope:{},它工作正常,您可以看到 falsetrue 范围共享。我没有调查过 false 还是 true 胜出,但我怀疑 true 因为它指示 $compile需要一个新的范围。

HTML:

<body ng-controller="MainCtrl">
  <div false-scope true-scope isolated-scope>
    <b>False directive</b>
    <ul>
      <li>Loaded: {{ falseDirectiveLoaded }}</li>
      <li>Data: {{ falseDirectiveData }}</li>
    </ul>
    <b>True directive</b>
    <ul>
      <li>Loaded: {{ trueDirectiveLoaded }}</li>
      <li>Data: {{ trueDirectiveData }}</li>
    </ul>
    <b>Isolated directive</b>
    <ul>
      <li>Loaded: {{ isolatedDirectiveLoaded }}</li>
      <li>Data: {{ isolatedDirectiveData }}</li>
    </ul>
  </div>
</body>

JS:

app.controller('MainCtrl', function($scope) {
  $scope.one = 1;
  $scope.two = 2;
  $scope.three = 3;
});

app.directive('falseScope', function() {
  return {
    restrict: 'A',
    scope: false,
    link: function(scope, element) {
      scope.falseDirectiveLoaded = true;
      scope.falseDirectiveData = [scope.one, scope.two, scope.three];
    }
  }
});

app.directive('trueScope', function() {
  return {
    restrict: 'A',
    scope: true,
    link: function(scope, element) {
      scope.trueDirectiveLoaded = true;
      scope.trueDirectiveData = [scope.one, scope.two, scope.three];
    }
  }
});

app.directive('isolatedScope', function() {
  return {
    restrict: 'A',
    scope: {},
    link: function(scope, element) {
      scope.isolatedDirectiveLoaded = true;
      scope.isolatedDirectiveData = [scope.one, scope.two, scope.three];
    }
  }
});

关于javascript - Angular 如何处理具有多个指令的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759279/

相关文章:

javascript - Date( 'YYYY-MM-DD' ) 构造一个比指定晚一天的日期 (Javascript)

javascript - 当我在本地运行页面时,Google Analytics 会发生什么情况?

Angularjs 从成功/错误和 promise 处理 ajax 有什么区别?

javascript - 我们如何在 AngularJS 中更改作用域变量的值

angularjs - 如何在 angularjs 中用 2 个相同的 Controller 制作原型(prototype)?

javascript - Xhtml 幻灯片放映不起作用

javascript - 通过添加 url 更改 div/span 内容?

javascript - 没有babel的nodejs mocha es6模块意外 token 导出

javascript单元测试变量和代码未封装在函数内

javascript - AngularJS + Jasmine : Comparing objects