变量更改未通知`$ scope。$ watch`

时间:2013-05-21 09:20:46

标签: javascript angularjs

我通过角度指令+控制器处理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之前,父作用域的值未更改。

1 个答案:

答案 0 :(得分:1)

使用$ scope。$ apply()的方法是正确的。原因是JQRangeSlider的更新发生在angularjs知识的“外部”。如果您阅读$ apply方法(http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply)上的文档,您将看到它在您需要的情况下使用。