angularjs在嵌套指令中继承范围

avo*_*ind 5 angularjs

示例:http://jsfiddle.net/avowkind/PS8UT/

我想要一个嵌套的子指令从其包装父指令获取其数据(如果存在),否则从外部控制器获取.

<div ng-controller="MyCtrl">
    <parent index="1">
        <child></child>
    </parent>
    <parent index="2">
        <child></child>
    </parent>
     <h1>No Parent</h1>
    <child></child>
</div>
<hr>
Run Code Online (Sandbox Code Playgroud)

期望的输出

Parent 1
  Child of parent 1
Parent 2
  Child of parent 2
No Parent
  Child of parent 0
Run Code Online (Sandbox Code Playgroud)

目前我的子对象只看到外部控制器值:

实际输出

Parent 1
  Child of parent 0
Parent 2
  Child of parent 0
No Parent
  Child of parent 0
Run Code Online (Sandbox Code Playgroud)

这是简单的版本; 实际上,外部指令从嵌套子项格式化的服务器获取数据,因此传达的是复杂对象而不是简单字符串.此外,子代是一个可视化,可以处理不同的数据集,因此外部父指令并不总是相同的类型.

更一般地说,我试图获得的模式是使用单独的指令来填充模型并查看它.所以更实际的用法是

<temperature-for city="Auckland">
   <plot/>
   <analysis/>
</temperature-for>

<humidity-for city="Hamilton">
   <plot/>
   <analysis/>
</temperature-for>


<test-data>
   <plot/>
</test-data>
Run Code Online (Sandbox Code Playgroud)

Sve*_*inT 3

我个人使用的一种取得巨大成功的不同方法是将绘图和分析指令定义为隔离范围,然后双向绑定所需的输入。

这样,指令是完全独立的组件,具有显式的、定义的接口。我个人制定了这样的绘图指令:

<plot data="countries['Auckland'].plot.data" options="countries['Auckland'].plot.options" legend="external" zoom="xy"></plot>

Scope would look like:
scope: {
    data: '=',
    options: '=',
    zoom: '@?',  // '?' indicates optional
    legend: '@?',
}
Run Code Online (Sandbox Code Playgroud)

这样就不会混淆该组件工作需要哪些数据,并且您可以在指令内编写所需输入属性的文档。

总而言之,这种模式非常适合 AngularJS 中的大部分用例,即只要存在可重用性的情况。

编辑:只是想补充一点:查看您的 HTML,绝对没有任何指示这些指令使用什么,它们可能依赖于任何东西(例如,它们是否从服务获取所有数据?或者它们依赖于父作用域吗?如果那么,什么范围?)