我通过角度指令+控制器处理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
之前,父作用域的值未更改。
答案 0 :(得分:1)
使用$ scope。$ apply()的方法是正确的。原因是JQRangeSlider的更新发生在angularjs知识的“外部”。如果您阅读$ apply方法(http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply)上的文档,您将看到它在您需要的情况下使用。