【问题标题】:AngularJS : Child directive scope to inherit from parent directive isolated scope?AngularJS:从父指令隔离范围继承的子指令范围?
【发布时间】:2015-07-20 18:48:21
【问题描述】:

如果ab 是我的指令,那么ba 的子元素:

<a>
  <b></b>
</a>

如果a 有一个独立的作用域,那么b 是否可以继承它?

示例js:

app.directive('a', function () {
  return {
    restrict: 'E',
    scope: {},
    controller: function ($scope) {
      $scope.prop1 = ...
    }
  }
});
app.directive('b', function () {
  return {
    restrict: 'E',
    controller: function ($scope) {
      //how to access $scope.prop1 here?
    }
  }
});

有了这个,我正在尝试制作可重用的指令,并且应该在彼此之间嵌套使用。

我知道我可以 require 指令 b 上的 a 控制器在 b 的链接功能中访问它,作为在控制器之间共享数据的一种方式,但这种方法不起作用如果我有不止一层的嵌套,那就太好了。

【问题讨论】:

  • 你能用 plunkr 添加一些代码吗?你尝试了什么,你的问题是什么?
  • @PankajParkar 我希望能够在嵌套指令(具有多个嵌套级别)之间共享数据,而不会污染非指令范围。
  • @charlietfl,如果&lt;a&gt;scope: {},则b 不会继承它
  • @NewDev 理解......我的观点是缺乏明确性而没有试图假设任何事情

标签: angularjs angularjs-directive angularjs-scope


【解决方案1】:

这是您需要使用手动嵌入功能的地方。如果父指令具有隔离作用域,则子 DOM 元素(及其指令)不会从它继承(仅当它们在其模板中时)。

嵌入时,可以显式指定范围:

.directive("a", function(){
  return {
    scope: {},
    transclude: true,
    link: function(scope, element, attrs, ctrls, transclude){
       var newScope = scope.$new();
       transclude(newScope, function(clone){
         element.append(clone);
       })
    }
  };
});

不过,您应该注意,尽管上述方法可行(从某种意义上说,子指令的范围将继承父指令的隔离范围),但对于您的指令的用户来说,这也是一种有些混乱的体验。

要了解原因,假设a 在其范围内公开了一些$innerPropa 的用户现在必须知道这样的属性是“神奇地”可用的。在不了解a 的情况下,这会降低 HTML 的可读性:

<a>
  <b item="$innerProp"></b>
</a>

附录

根据您的用例,可能还有其他更合适的方法。当ab 是独立的并且a 使用其内容允许其用户指定一些模板时,上述方法效果更好。

如果b 仅(或大部分)用作a 的子级,那么它应该require 它。 a 可以通过其控制器 API 向 b 公开它需要的任何内容。

最后,如果a 具有明确定义的结构,那么它应该使用其template 来指定b。在您的示例中,这可以通过模板轻松实现。

【讨论】:

  • 为什么我必须在 中做一个item="$innerProp" 才能捕获 暴露的属性?当我们使用scope.$new()时,不是继承自吗?
  • @PeeyushKushwaha,您不必必须。您可以依靠(尽管可以说,这不是最佳实践)神奇地在b 的链接功能中拥有scope.$innerProp - 它就在那里。但通常指令通过属性显式获取它们的数据。此外,您可能需要使用其他一些指令(例如ng-if),您必须使用属性
  • 这不是问题,因为在我的用例中, 将在 中使用,而 肯定必须公开$innerProp
  • @PeeyushKushwaha,那么,由于ba 之间的紧密耦合,我建议使用require。如果b 很少(如果有的话)独立存在,那么这似乎是更好的方法。另外,如果b必须总是在a里面,那么在a的模板中设置b也应该考虑
  • 您的解决方案似乎有效。但我很好奇幕后发生了什么。您能否解释一下手动嵌入的内容或指出一些可能的文档?
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多