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



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

例如,假设我有:

<input type="checkbox" ng-checked="vm.isInSet(vm.results.selectedRoles, role.id)"/>

vm.results发生变化时,我希望ng-checked更新,即 应该再次调用vm.isInSet。或者,如果我需要调用某种显式方法来刷新页面上的所有元素,那也没问题。我尝试了$scope.$apply(),但得到"$digest已经在进行中"错误,所以摘要周期已经在发生。

$watch有助于监听$scope变化

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

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

$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(...);
});

最新更新