角度范围绑定&(&符号)是一次性绑定吗? 我认为它被称为单向绑定,但它也是一次性的吗?
让我说我有:
<my-custom-directive data-item="item" />
我的指令声明如下:
.directive('myCustomDirective', [
'$log', function ($log) {
return {
restrict: 'E',
templateUrl: '/template.html',
scope: {
dataItem: '&'
}
controller: function ($scope) {
// ....
}
}])
我问的是绑定是否是一次性的原因是因为这似乎是我正在观察的,即。如果父作用域中的item
已更新,则指令中的.directive('myCustomDirective', [
'$log', function ($log) {
return {
restrict: 'E',
templateUrl: '/template.html',
scope: {
dataItemOriginal: '='
},
link: function ($scope) {
$scope.$watch('dataItemOriginal', function () {
$scope.dataItem = window.angular.copy($scope.dataItemOriginal);
});
},
controller: function ($scope) {
//....
}
}])
不会更新。
我是否正确地说绑定是一次?
为了实现我想要的,指令保存副本而不影响父作用域的项目 - 我这样做了:
{{1}}
这是正确的还是有更好的方法?
答案 0 :(得分:10)
有一种更好的方法。您当前的解决方案是设置三个手表 - 两个是使用“=”绑定创建的,然后是您创建的额外$ watch以制作副本。 $手表相对昂贵。
这是一种不会创建任何手表的替代方案:
.directive('myCustomDirective', [
'$log', function ($log) {
return {
restrict: 'E',
templateUrl: '<div ng-click="clicked()">Click me for current value</div>',
scope: {
item: '&'
},
controller: function($scope) {
$scope.clicked = function(){
alert(item()); //item() returns current value of parent's $scope.item property
}
$scope.val = item(); //val is the initial value of $parent.item
$scope.val = 42; //$parent.item is unaffected.
}
}])
&安培;被高度误解了。虽然它可以用于将函数传递到一个独立的范围,但它实际上做的是:
提供了一种在父上下文中执行表达式的方法 范围
它在指令中生成一个函数,在调用时,它在父作用域的上下文中执行表达式。表达式不必是函数或函数调用。它可以是任何有效的角度表达式。
所以在你的例子中:
<my-custom-directive data-item="item"></my-custom-directive>
scope: {
item: '&'
}
指令中的$ scope.item将是一个可以在控制器或模板中调用的函数。调用该函数将返回父作用域中“item”引用的对象。与&amp; - 没有使用手表。
“单向绑定”用词不当的地方是使用&amp;,指令不能改变$ parent.item的值,在使用“=”时,指令凭借$ watch创造,可以。它也不是“一次性”,因为它在技术上根本没有约束力。
由于angular用于生成函数的机制涉及$ parse,因此指令可以传入“locals”,它使用指令中的值覆盖表达式中的值。所以,在指令控制器中,如果你这样做:
item({item: 42})
无论父范围中的项值是多少,它总是返回42。这个功能使得&amp;用于使用指令中的数据在父作用域上执行函数表达式。