升级到Angular 1.2.1后的范围层次结构问题

时间:2013-11-22 13:23:15

标签: angularjs

我们最近升级到Angular 1.2.1,并且遇到了ng-include的一些问题。

这是一个简化示例,显示了我们在Angular 1.1.1中的用法:
http://jsfiddle.net/Dq57j/1/

这是Angular 1.2.1的另一个小提琴,解决了我们的问题:
http://jsfiddle.net/78FJJ/4/

- HTML剪辑 -

   <div ng-controller="RootCtrl" id="a">
      Hello, {{name}}!

      <!-- does not work in Angular 1.2.1 -->
      <!--div ng-controller="TemplateCtrl" id="b"
           ng-include src="'template.html'">
      </div-->

      <!-- workaround -->
      <div ng-controller="TemplateCtrl" id="b">
          <div ng-include src="'template.html'">
          </div>  
   </div>

如果您注释变通方法并运行原始代码,则此示例将无法按预期工作,即输出“模板说:”。似乎模板无法读取TemplateCtrl初始化的范围。

如果你在jsfiddle之外进一步调查问题并密切观察生成的范围(例如使用Batarang),你会看到生成了以下范围层次结构(其中范围名称反映了相应div的id):

一个
| _ c
| _ b

对我而言,这似乎很奇怪。 Angular如何扭曲范围层次结构,根据我应该 a-> b-&gt; c ?请注意,此示例在v.1.1.1中起作用的原因是,在该Angular版本中,层次结构是 a-&gt; b-&gt; c

任何人都可以解释这个以及两个版本之间究竟发生了什么变化吗?

1 个答案:

答案 0 :(得分:0)

版本1.2.0-rc3发生了重大变化,影响了转换的工作方式,以及转换/隔离范围在同一元素上的通信方式。

所以是的,现在同一元素上的ng-controller和ng-include(它是transclude:element)将不再共享范围。这是预期的行为。

“为什么”解释会过于复杂,但是,这就是它现在的运作方式。您的“解决方法”是您现在想要做的正确方法。

编辑:它不是1.2.0-rc3,它是最终的1.2.0:来自更改日志:

由于909cabd3,没有隔离范围的指令不会从同一元素上的isolate指令获取隔离范围。如果您的代码依赖于此行为(非隔离指令需要从隔离范围内访问状态),请更改isolate指令以使用范围本地明确地传递这些。