0

我正在通过角度指令 + 控制器处理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

4

1 回答 1

1

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

于 2013-05-21T10:45:14.930 回答