如何强制绑定到函数的属性进行刷新

时间:2016-02-09 15:41:33

标签: angularjs

当angular属性绑定到控制器/作用域的属性时,它会在该属性更改时自动更新。如何获取绑定到控制器/作用域方法的属性?

例如,假设我有:

BarBazRecord

<input type="checkbox" ng-checked="vm.isInSet(vm.results.selectedRoles, role.id)"/> 发生变化时,我希望vm.results更新,即应再次调用ng-checked。或者,如果我需要调用某种显式方法来刷新页面上的所有元素,那也没关系。我尝试了vm.isInSet,但得到了“$ digest in progress”错误,因此摘要周期已经发生。

2 个答案:

答案 0 :(得分:1)

$ watch有助于收听$ scope更改

这就是您创建自己手表的方式。 $ watch服务可以帮助您在附加到$ scope的某个值发生更改时运行一些代码。它很少使用,但有时很有帮助。例如,如果你想每次都运行一些代码,那么myVar&#39;更改,您可以执行以下操作:

function MyController($scope) {

    $scope.myVar = 1;

    $scope.$watch('myVar', function() {
        alert('hey, myVar has changed!');
    });

    $scope.buttonClicked = function() {
        $scope.myVar = 2; // This will trigger $watch expression to kick in
    };
}

答案 1 :(得分:0)

$ apply / $ digest没有运行vm.isInSet函数,用户操作会...

因为ng-checked是一个布尔验证器,所以你可以将逻辑从html移动到anguler指令/控制器,即:

<input type="checkbox" ng-checked="vm.states"/>

$scope.$watch('vm.results',function(newVal){
   vm.state = vm.isInSet(...);
});

如果您有多个复选框,则可以使用数组:

<input type="checkbox" ng-checked="vm.states[role.id]"/>

$scope.$watch('vm.results',function(newVal){
   vm.state[..] = vm.isInSet(...);
});