变量更改没有通知到' $scope.$watch '

variable change not notified to `$scope.$watch`

本文关键字:scope watch 知到 通知 变量      更新时间:2023-09-26

我正在处理一个JQRangeSlider通过一个角指令+控制器。

在我的控制器中,我为范围变量分配新值,但没有通知控制器范围(我在我的指令中使用隔离的范围'='),即使它是正确更新的。

// JQRangeSlider event handler
var valuesChanged = function(e, data) {
    if (data.values.min && data.values.max) {
        console.log('values changed', data.values); // this is always printed
        $scope.minselectedtime = data.values.min; // not triggering $scope.$watch
        $scope.maxselectedtime = data.values.max; 
        $scope.$broadcast('minchanged', $scope.minselectedtime); // instantly triggering $scope.$on('minchanged',...)
        console.log('scope', $scope);
    }
};

$scope.$watch('minselectedtime', function(newValue, oldValue) {
    if (newValue === oldValue) {
        return;
    }
    console.log('minselectedtime -->', newValue);
}, true);
$scope.$on('minchanged', function(event, min) {
    console.log('minchanged ==>', min);
});

$scope.$watch('minselectedtime', ...)仅在下一次$scope修改时触发(其中$scope.minselectedtime甚至没有被修改):

$scope.toggleTimeScale = function(refinementString) {
    console.log('scale set to', refinementString);
    $scope.timescale = refinementString; // year, month, day...
} 

为什么没有立即通知$scope.$watch变量的变化?
被隔离的代码的$scope.minselectedtime值被改变了,但是父作用域直到$scope.toggleTimeScale被触发才看到它的值被改变。

您使用$scope.$apply()的方法是正确的。原因是JQRangeSlider的更新发生在angularjs的知识之外。如果您阅读了关于$apply方法(http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply)的文档,就会发现它用于您需要的情况。