Я обрабатываю 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()' сразу после назначения новых значений '$ scope.minselectedtime' и' $ scope.maxselectedtime', но я сомневаюсь, что это правильный способ справиться с этим , Есть ли лучший способ сделать это? – rxdazn