尝试测试一个简单的指令,如果传递的值为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,但仍然只能运行一次。
答案 0 :(得分:1)
它仅适用于一个,因为passValue()
函数将$scope.triggerObj.trigger
设置为true
。并且您的$watch
仅在旧值不等于新值时有效,但您首先将$scope.triggerObj.trigger
从false
更改为true
,其他所有时间都不会更改(您只是尝试将$scope.triggerObj.trigger
从true
再次更改为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'
}