具有隔离和非隔离范围的指令内容

时间:2016-01-21 07:10:39

标签: angularjs angularjs-directive angularjs-scope

我发现指令内部内容的范围:true 类型有一种奇怪的行为:

<body ng-init="x=10">
    <mydir>
       {{x}}
    </mydir> 
</body>

所以{{x}}是内部内容,指令定义是:

.directive('mydir', function() {
   return {
       scope: {},
       link: function(scope){
           scope.x = 5;
       }
   };
});

当我们将范围定义为隔离(范围:{} )时,它会将{{x}}输出为10,因此使用外部范围。但是当我们为指令创建新范围(范围:true )时,它将使用它作为内部内容和输出5.因此它对内部内容使用不同的范围2个案例。有人可以给我一个关于源代码/手册的提示/链接,以解释这种不一致吗?

以下plnk可以使用代码。

UPD :我明白什么是JavaScript原型继承。我知道指令范围类型之间的区别。我的目标不是显示5而不是10。问题是关于内部模板,在两种情况下都应该使用父范围进行插值,父范围无法访问子/隔离的属性。

3 个答案:

答案 0 :(得分:5)

在原始代码段中,ViewHolder不属于{{x}}。您应该为指令定义模板。

<mydir>

这是the preview

答案 1 :(得分:3)

A得到了角度问题的答案: https://github.com/angular/angular.js/issues/13845#issuecomment-174953398

以下是源代码答案: https://github.com/angular/angular.js/blob/eae0a1121ffcc636d760463105dcdc548ea47390/src/ng/compile.js#L2538-L2545

var scopeToChild = scope;
if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {
      scopeToChild = isolateScope;
}
childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);

<强>履历: 在隔离范围类型的情况下,范围仅适用于指令模板,但不适用于内部内容。

答案 2 :(得分:2)

有些不对劲的事情正在发生。如果您在启用了Batarang的Chrome中运行代码,则可以看到范围:{} 时确实创建了与第一个分开的新范围,完全断开连接,并将变量设置为5。但是您的插值字符串绑定到外部范围。如果设置范围:true ,它还会创建一个从外部继承的新范围,并且{{x}}插值正确绑定。我不认为它是指令上的scope参数不起作用,带绑定的东西不起作用。