@schurin
Люблю катать с гор, особенно на санках

Почему не отрабатывает data-binding, а при вызове $scope.digets() говорит мол apply уже запущен?

Доброго дня!
Дорабатываю режим истории, есть слайдер, который можно запустить и данные по элементам начнут обновляться по заданному интервалу.
$scope.timeline.range.start(end) - переменные модели, показывают текущий отображаемый промежуток
_intermediateRange.start(end) - использую для отправки запросов за данными, передаю при инициализации режима истории объект в механизм отправки запроса
Сам механизм отправки запросов, был написан еще до того как на проекте появился angular

Зачем же мне понадобился дополнительный объект(_intermediateRange)?
Инкремент переменной модели происходит сразу после получения ответа, в следствии чего данные в модели изменяются раньше чем за ними уходит запрос, менять механизм отправки данных не представляется возможным

Так вот, на каждой итерации, попадаем в _playback, где меняем переменную модели, вот тут и проблема data-binding не срабатывает, запросы уходят, $scope.timeline.range.start(end) меняются, во вьюхе же остаются старые данные, дописал $scope.digest(); 3-я строчка метода _playback и получаю в консоль:
Error: [$rootScope:inprog] $apply already in progress
Я так понял, что digest уже выполняется

function _playback(sender, eventArgs) {
				$scope.timeline.range.start = _intermediateRange.start;
				$scope.timeline.range.end = _intermediateRange.end;
				$scope.$digest();
				_playStep();
			}
function _playStep() {
				var range = parseInt($scope.timeline.range.end - $scope.timeline.range.start);

				if(_intermediateRange.end == $scope.timeline.bounds.end) {
					return false;
				}else if(_intermediateRange.end + $scope.timeline.shift > $scope.timeline.bounds.end) {
					_intermediateRange.end = $scope.timeline.bounds.end;
					_intermediateRange.start = $scope.timeline.bounds.end - range;
				}else {
					_intermediateRange.start += $scope.timeline.shift;
					_intermediateRange.end += $scope.timeline.shift;
				}
			}


А началась вся эта интересная история с data-binding после того как добавил вызов _playback в следующий метод, можно и без него и собственно ошибок не будет)
Но тогда запрос за первой порцией данных будет тот что мы уже видим
function _startPlayback() {
				var timeline = $scope.timeline;
				var rate = timeline.updateRate / timeline.multiply;
				rate = rate < MIN_RATE ? MIN_RATE : rate;

				_stopPlayback();

				if($scope.timeline.range.end > $scope.timeline.bounds.end) {
					_setToStart();
				}

				_playback();
				params.makeAction($scope.controller, 'timeline_start_playback', {_playback: _playback, rate: rate});
			}


Подскажите плиз может кто знает как дебажить angular, понять кто вызвал didgest и почему данные в модели остаются неизменными, при изменении переменной $scope.
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
@schurin Автор вопроса
Люблю катать с гор, особенно на санках
$scope.$$phase || $scope.$digest()
Решило проблему, прежде чем вызвать $digest проверяем не запущен ли уже digest($apply)
Осталось всё же непонятно, почему во вьюхе всё было без изменений
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lega
где меняем переменную модели, вот тут и проблема data-binding не срабатывает
Что вы имеете ввиду под "модель"?

вызове $scope.digets() говорит мол apply уже запущен
Порядок такой, после какого-то события ангуляр (или вы) вызываете $digest, он ищет изменения и вызывает ваши калбеки, в этих калбеках вы рекурсивно пытаетесь вызвать $digest, поэтому он ругается. Вам нужно проверять статус и не запускать $digest если он выполняется, после этого (после вашего калбека) ангуляр делает ещё один дигест цикл и находит ваши изменения из последнего калбека.

data-binding не срабатывает
Если данные не выводятся в DOM, то скорее всего вы меняете не те данные (либо пытаетесь вывести не те)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы