角度范围绑定&(&符号)是一次性绑定吗?

时间:2015-04-09 19:09:17

标签: javascript angularjs angularjs-scope angular-directive

角度范围绑定&(&符号)是一次性绑定吗? 我认为它被称为单向绑定,但它也是一次性的吗?

让我说我有:

<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}}

这是正确的还是有更好的方法?

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;用于使用指令中的数据在父作用域上执行函数表达式。