angular指令,与布尔值的双向数据绑定只能工作一次

时间:2017-06-22 11:13:14

标签: javascript angularjs

尝试测试一个简单的指令,如果传递的值为true,它将运行但它只能运行一次。

指令:

.directive('myDirective', function(){
        return {
            restrict: 'A',
            scope: {
               triggerObj: '@myDirective'
            },
            link: function (scope, elem, attrs) {
                scope.$watch('triggerObj', function() {
                    alert('success')
                });
            }
        };
    })

控制器:

$scope.triggerObj = {};
$scope.triggerObj.trigger = false;

$scope.passValue = function(){
    //set to true
    $scope.triggerObj.trigger = true;
}

视图:

<div my-directive='{[triggerObj.trigger]}'>
<button type='button' ng-click='passValue()'>click</button>

还尝试在设置为true之前将值重置为false,但仍然只能运行一次。

3 个答案:

答案 0 :(得分:1)

它仅适用于一个,因为passValue()函数将$scope.triggerObj.trigger设置为true。并且您的$watch仅在旧值不等于新值时有效,但您首先将$scope.triggerObj.triggerfalse更改为true,其他所有时间都不会更改(您只是尝试将$scope.triggerObj.triggertrue再次更改为true

要做到这一点,请尝试将$scope.passValue功能升级到:

$scope.passValue = function() {
  if($scope.triggerObj.trigger) {
    $scope.triggerObj.trigger = false;
  } else {
    $scope.triggerObj.trigger = true;
  }
}

答案 1 :(得分:1)

当您更改类似
的passValue函数时,它会起作用 http://jsfiddle.net/yjjysdzw/

  $scope.passValue = function() {
    $scope.triggerObj.trigger = !$scope.triggerObj.trigger;
  }

答案 2 :(得分:1)

使用&#39; =&#39;实现双向数据绑定,而不是&#39; @&#39;。

scope: {
  triggerObj: '=myDirective'
}