Please check this plnkr简单angularjs隔离范围嵌套指令
我已阅读everyhting可以找到有关指令,范围和隔离范围。但我仍然无法理解这种工作方式。
只要它不嵌套在另一个指令中,我创建的指令就可以完美工作。
当嵌套时,'localFunc:'& func“'属性绑定到外部控制器作用域就好了,但'localAttr:'= attr''作用域失败。
我会永远感激的是,任何人都可以帮助我理解为什么。
Please check this plnkr简单angularjs隔离范围嵌套指令
我已阅读everyhting可以找到有关指令,范围和隔离范围。但我仍然无法理解这种工作方式。
只要它不嵌套在另一个指令中,我创建的指令就可以完美工作。
当嵌套时,'localFunc:'& func“'属性绑定到外部控制器作用域就好了,但'localAttr:'= attr''作用域失败。
我会永远感激的是,任何人都可以帮助我理解为什么。
形象地,这里是你的范围是什么样子之前,我们键入文本两种:
注意隔离范围006的母公司是由指令container
创建的transcluded范围。因此,范围006中的searchText
将被数据绑定到范围005(而不是范围003),因为正在使用基元。
如果我们输入11
到第一个文本框,并22
进入第二个文本框,并再次检查范围,我们可以看到在数据绑定发生了:
searchforThis2
在范围005色的黄色以表明已创建新的财产。发生这种情况是因为使用了一个原语 - 范围005在这里不使用原型继承,它只是为它自己创建一个新的原始属性(即它不在范围003中查找属性名称)。其他黄色项目表示原始值已更改。
正如您已经发现的那样,此问题的“最佳实践”解决方案是绑定到父作用域中的对象属性(而非基元)(即作用域003)。
在你的控制器使用以下:
$scope.obj = {searchforThis1: "Sample Text 1", searchforThis2: "Sample Text 2"};
,并在你的HTML:
<search searchtext="obj.searchforThis1"...>
...
<div container>
<search searchtext="obj.searchforThis2"...>
作用域现在看起来如下:
如果我们输入11
进入第一个文本框和22
放入第二个文本框并再次检查范围,我们可以看到t他的数据绑定发生了:
因为范围006是分离的范围,它使用$parent
去范围005(如上)。但是,从那里开始,原型继承就在发挥作用,因为我们不使用原始类型。对象属性searchforThis2
位于范围003.
永不失败。小时的谷歌搜索没有任何结果,直到我实际输入问题,然后我搜索关键字和瞧!答案就会出现。
感谢this very illuminating post我知道我的问题非常常见,甚至有一个名称 - “点规则”。
基本上你需要引用控制器上的继承对象而不是属性,问题就消失了。
从角度github wiki有益阅读https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance – charlietfl
感谢您的参考那'非常有启发性'! – Airn5475
明智的解释。谢谢。 您是仅仅为这个问题绘制这些图表还是您有一些工具可以检查angularjs范围并准备这些图表? – thrag
@thrag,我有一个我写/正在写的工具。 –
@MarkRajcok您可否考虑公开发布此工具,以便我们可以动态绘制这些精彩的示波器地图?我相信很多头痛可以避免,许多长时间的谈话会被保存:) –