2013-03-30 190 views
16

Please check this plnkr简单angularjs隔离范围嵌套指令

我已阅读everyhting可以找到有关指令,范围和隔离范围。但我仍然无法理解这种工作方式。

只要它不嵌套在另一个指令中,我创建的指令就可以完美工作。

当嵌套时,'localFunc:'& func“'属性绑定到外部控制器作用域就好了,但'localAttr:'= attr''作用域失败。

我会永远感激的是,任何人都可以帮助我理解为什么。

回答

32

形象地,这里是你的范围是什么样子之前,我们键入文本两种: scopes

注意隔离范围006的母公司是由指令container创建的transcluded范围。因此,范围006中的searchText将被数据绑定到范围005(而不是范围003),因为正在使用基元。

如果我们输入11到第一个文本框,并22进入第二个文本框,并再次检查范围,我们可以看到在数据绑定发生了:

enter image description here

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"...> 

作用域现在看起来如下: enter image description here

如果我们输入11进入第一个文本框和22放入第二个文本框并再次检查范围,我们可以看到t他的数据绑定发生了:

enter image description here

因为范围006是分离的范围,它使用$parent去范围005(如上)。但是,从那里开始,原型继承就在发挥作用,因为我们不使用原始类型。对象属性searchforThis2位于范围003.

+0

明智的解释。谢谢。 您是仅仅为这个问题绘制这些图表还是您有一些工具可以检查angularjs范围并准备这些图表? – thrag

+2

@thrag,我有一个我写/正在写的工具。 –

+5

@MarkRajcok您可否考虑公开发布此工具,以便我们可以动态绘制这些精彩的示波器地图?我相信很多头痛可以避免,许多长时间的谈话会被保存:) –

3

永不失败。小时的谷歌搜索没有任何结果,直到我实际输入问题,然后我搜索关键字和瞧!答案就会出现。

感谢this very illuminating post我知道我的问题非常常见,甚至有一个名称 - “点规则”。

基本上你需要引用控制器上的继承对象而不是属性,问题就消失了。

+3

从角度github wiki有益阅读https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance – charlietfl

+1

感谢您的参考那'非常有启发性'! – Airn5475