2013-05-21 5 views
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.

+0

Я разрешил свою проблему с помощью '$ scope. $ Apply()' сразу после назначения новых значений '$ scope.minselectedtime' и' $ scope.maxselectedtime', но я сомневаюсь, что это правильный способ справиться с этим , Есть ли лучший способ сделать это? – rxdazn

ответ

1

Ваш метод использования $ scope. $ Apply() правильный. Причина в том, что обновление от JQRangeSlider произошло «вне» знания angularjs. Если вы прочитали документацию по методу $ apply (http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply), вы увидите, что она используется в том случае, если вам нужно.

Смежные вопросы