【问题标题】:Two way binding, shallow $watch, isolate scope not working together两种方式绑定,浅 $watch,隔离范围不能一起工作
【发布时间】:2013-04-05 04:38:50
【问题描述】:

请参考这个小提琴的问题。 http://jsfiddle.net/AQR55/

1) 为什么附加到隔离作用域属性(双向绑定到父属性)的手表不会在更改父作用域属性时触发。

在小提琴中,在更改绑定的父范围属性时,没有触发下面提到的手表。

$scope.$watch('acts', function(neww ,old){
                    console.log(neww)
                })

2)ng-click="addaction()" addaction="addaction()"。这段代码可以以更优雅的方式放置吗?因为,要在隔离范围内执行操作,似乎我们需要设置双向绑定和附加到 ng-click。

3) 我可以在隔离范围内声明方法,如下所示?如果我这样做,我会收到 .js 错误。

<isolate-scope-creating-cmp ng-click="isolateCmpClickHandler()"></isolate-scope-creating-cmp>
scope:{
    isolateCmpClickHandler:function(){
      //If i do like this, I'm getting .js error

    }
}

【问题讨论】:

  • 为什么要用第二点?
  • 我想为按钮设置事件处理程序。如第三点所述,由于我无法在隔离范围内设置单击处理程序,因此我必须将父范围中定义的函数之一设为单击处理程序。为此,我使用“&”来评估父作用域中的addaction(),并且我使用该父作用域评估的属性作为使用“ng-click”的单击处理程序。如果我删除 addaction="addaction()" ng-click 不起作用。您为问题号更新的小提琴。 1 没有触发按钮的点击按钮。请查看萤火虫。

标签: angularjs


【解决方案1】:

问题 1.
由于要向acts数组中添加一个项目,所以需要将$watch()中的第三个参数设置为true

$scope.$watch('acts', function (neww, old) {
    console.log(neww)
}, true);

演示:Fiddle

问题 2。
由于存在隔离作用域,所以需要调用$parent作用域的函数

<input type="button" bn="" acts="acts" ng-click="$parent.addaction()" value="Add Action" />

演示:Fiddle

问题 3.
是的,你可以,但你需要使用控制器

animateAppModule.directive('bn', function () {
    return {
        restrict: "A",
        scope: {
            acts: '='
        },
        link: function ($scope, iElement, iAttrs) {
            $scope.$watch('acts', function (neww, old) {
                console.log(neww)
            }, true)
        },
        controller: function($scope){
            $scope.dosomething = function(){
                console.log('do something')
            }
        }
    }
})

演示:Fiddle

整体解决方案可能如下所示

<input type="button" bn="" acts="acts" addaction="addaction()" value="Add Action" />

JS

animateAppModule.controller('tst', function ($scope) {
    $scope.acts = [];
    $scope.addaction = function () {
        $scope.acts.push({
            a: "a,b"
        })
    }
})

animateAppModule.directive('bn', function () {
    return {
        restrict: "A",
        scope: {
            acts: '=',
            addaction: '&'
        },
        link: function ($scope, iElement, iAttrs) {
            $scope.$watch('acts', function (neww, old) {
                console.log(neww)
            }, true);
            iElement.click(function(){
                $scope.$apply('addaction()')
            })
        }
    }
})

演示:Fiddle

【讨论】:

  • 由于角度监视器更改使用 angular.equals 使用 === 运算符,因此要查看复杂对象(如数组),您应该使用 watch 表达式传递 true 以比较对象相等性而不是引用
  • $parent 的使用是code smell,这是更深层次问题的征兆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多