具有简单angularjs嵌套指令的隔离范围

thr*_*rag 16 angularjs angularjs-directive angularjs-scope

请检查这个plnkr

我已经阅读过所有关于指令,范围和隔离范围的信息.但我仍然无法理解使这项工作的方式.

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

嵌套时,'localFunc:"&func"'属性绑定到外部控制器范围就好了,但'localAttr:"= attr"'范围失败.

如果有人能帮我理解原因,我将永远感激不尽.

Mar*_*cok 32

从图中可以看出,在输入任一文本框之前,这是您的示波器的样子: 领域

请注意,隔离范围006的父级是由指令创建的转换范围container.因此,searchText范围006将被数据绑定到范围005(而不是范围003),因为正在使用基元.

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

在此输入图像描述

searchforThis2在范围005中显示为黄色,表示已创建新属性.这是因为使用了原语 - 范围005在这里不使用原型继承,它只是在自身上创建一个新的原始属性(即,它不在范围003中查找属性名称).其他黄色项表示原始值已更改.

正如你已经发现,"最佳实践"解决这个问题是绑定到对象的属性(而不是原语)父范围(即范围003).

在控制器中使用以下命令:

$scope.obj = {searchforThis1: "Sample Text 1", searchforThis2: "Sample Text 2"};
Run Code Online (Sandbox Code Playgroud)

并在您的HTML中:

<search searchtext="obj.searchforThis1"...>
...
<div container>
  <search searchtext="obj.searchforThis2"...>
Run Code Online (Sandbox Code Playgroud)

范围现在如下所示: 在此输入图像描述

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

在此输入图像描述

因为范围006是隔离范围,所以它使用它$parent来到范围005(如上所述).然而,从那里开始,原型继承正在发挥作用,因为我们没有使用原语.对象属性searchforThis2位于范围003中.

  • @MarkRajcok你能否考虑公开发布这个工具,这样我们就可以动态绘制这些精彩的范围图?我相信可以避免许多令人头疼的问题,并且可以节省很多长时间的对话:) (5认同)
  • @thrag,我有一个我写/写的工具. (2认同)