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

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

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект