请有人解释我,为什么attrDir
的范围变量可见,而 oneWay
's却没有?我认为scope: {}
也是孤立的。
angular.module('test', []);
angular.module('test').directive('attrDir', attrDir);
function attrDir(){
return {
scope: true,
link: function(scope){
scope.hello = 'attrDir';
}
};
}
angular.module('test').directive('oneWay', oneWay);
function oneWay(){
return {
scope: {
data: '<?'
},
link: function(scope){
scope.hello = 'oneWay';
}
};
}
hello
仅在attr-dir
中渲染。
<attr-dir>
<span>{{hello}}</span>
</attr-dir>
<one-way>
<span>{{hello}}</span>
</one-way>
这是一个plunker:https://plnkr.co/edit/2cm4vvrshwujvabj2q8t?p = preview
thx。
首先,您要观察到的与<
绑定无关。
问题是两个指令中的表达式{{hello}}
不是这些指令模板的一部分。对于此类元素,绑定规则不同。
Angular自动为{{hello}}
表达式创建链接函数。但是,在您的情况下,评估这些链接功能的范围不同。
您可能期望的是:
rootScope
/
/
attr-dir-new-scope one-way-isoloate-scope
/
/
{{hello}} {{hello}}
但是,根据来源中的这一评论:
//我们仅通过孤立范围,如果分离物指令具有 模板,
//否则子元素不属于分离株 指令。
真实的图片是:
root scope
/
/
attr-dir-new-scope one-way-isoloate-scope
/
/
{{hello}} {{hello}}
因此,在您的示例中,第一个指令<attr-dir>
不会创建孤立范围,而是创建新范围,因此,当链接到Angular时,将此新范围传递到您的指令的链接功能:
link: function(scope){
scope.hello = 'attrDir';
}
以及为{{hello}}
表达式创建的链接函数。这就是为什么当您在链接函数中添加值时,它可以在表达式链接函数中可用。
但是您的第二个指令<one-way>
创建孤立范围,并且根据我上面提到的评论,指令的链接函数获取隔离范围,但是链接表达式的函数接收不同的范围(示例中的根范围)。因此,您要在不同的范围上添加hello
值。这就是为什么值不确定的原因。
范围:true和范围:{}将为指令创建一个子范围。但是,
范围:true将原型从母体继承属性(例如指令所在的控制器):{}不会继承父母的属性,因此称为孤立
单一是一个孤立的范围指令,您没有通过Hello,因此在HTML中不确定。
如果未指定范围,则将共享范围。如果将范围指定为true,则将其继承范围。如果用卷曲支架指定范围,则是孤立范围。
可视化范围的最佳方法是使用console.log语句在您的链接函数中,
link: function(scope) {
scope.hello = 'attrDir';
console.log('scope in attrDir: ', scope);
}
link: function(scope) {
scope.hello = 'oneWay';
console.log('scope in oneWay: ', scope);
}
如果打开开发人员工具,您将看到第一个指令在其原型中继承其父范围
__proto__:Scope
第二个是一个具有自己范围的对象(通过使用卷曲括号,您给了孤立范围)
__proto__:Object
因为您正在指令中实现组件绑定。
&lt;符号表示自1.5以来可用的单向绑定。
如果要在one-way
中显示hello
,则应该更改以下内容:
html
<one-way hello="$ctrl.hello">
<span>{{$ctrl.hello}}</span>
</one-way>
JS
angular.module('test').component('oneWay', {
bindings:{
hello:'='
},
controller: function() {
this.hello = 'oneWay';
}
});
演示
plnkr