我们最近升级到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 。
任何人都可以解释这个以及两个版本之间究竟发生了什么变化吗?
答案 0 :(得分:0)
版本1.2.0-rc3发生了重大变化,影响了转换的工作方式,以及转换/隔离范围在同一元素上的通信方式。
所以是的,现在同一元素上的ng-controller和ng-include(它是transclude:element)将不再共享范围。这是预期的行为。
“为什么”解释会过于复杂,但是,这就是它现在的运作方式。您的“解决方法”是您现在想要做的正确方法。
编辑:它不是1.2.0-rc3,它是最终的1.2.0:来自更改日志:
由于909cabd3,没有隔离范围的指令不会从同一元素上的isolate指令获取隔离范围。如果您的代码依赖于此行为(非隔离指令需要从隔离范围内访问状态),请更改isolate指令以使用范围本地明确地传递这些。