【发布时间】:2016-08-11 03:33:43
【问题描述】:
我遇到过这种isolate binding 规范:
scope: {
property: "=*"
}
这里的星号是什么意思?有人可以举个例子吗?
【问题讨论】:
标签: javascript angularjs
我遇到过这种isolate binding 规范:
scope: {
property: "=*"
}
这里的星号是什么意思?有人可以举个例子吗?
【问题讨论】:
标签: javascript angularjs
与
=*的隔离绑定是为了浅层观察集合的变化。
让我解释一下:
通常我们在脚本中使用的 watchCollection 变量如下:
$scope.arr = ['foo', 'bar', 'lorem', 'ipsum'];
$scope.arrCount = 4;
$scope.$watchCollection('arr', function(new, old) {
$scope.arrCount = new.length;
});
但是如果你想在 html 属性本身中做对象绑定呢?
<my-directive my-attr="arr"><!--$scope.arr-->
如果你这样做:
scope: {
myAttr: "=*"
}
现在,指令属性被分配,因为它应该浅表观察。并且这次使用watchCollection很好用。
所以,=* 将在我们需要浅层监视更改时使用(即 $watchCollection 而不是 $watch),您可以使用 =* 或 =attr (=? 或 = *?attr 如果该属性是可选的),如docs 中所述。
虽然,我们可以使用= for watchCollection 来深入观察我们可以使用=* 的对象或数组。但唯一的区别是使用 =* 方法 collection 变为 true 并且当集合变为 true angularjs 使用 $watchCollection 删除观察者并使用 $watch 删除收集为假时的观察者:
if (definition.collection) { //using `=*`
removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch);
} else { //using `=`
removeWatch = scope.$watch($parse(attrs[attrName],
parentValueWatch), null, parentGet.literal);
}
所以,当你想浅层观察 collection 时,你需要使用=*。
【讨论】:
$watchCollection 方法,您能否修改我的示例以使其更清楚?
$watchCollection,所以我不能尝试你的建议......这是令人困惑的部分
=。可能我们只能使用 $watchCollection。将调试并通知您。
星号用于更改默认观看行为。
默认情况下,$watch 方法用于跟踪更改,相等性检查基于对象标识。但是,如果对象字面量或数组字面量作为绑定表达式传递,则相等性检查是按值完成的(使用 angular.equals 函数)。也可以使用 $watchCollection 浅层观察评估值:使用 =* 或 =attr(=? 或 =*?attr,如果属性是可选的)。
【讨论】: