1

Я делаю запрос AJAX для данных, которые используются в представлении для генерации списка. Мне нужно знать, когда обновляется область $, и когда представление отображается после успешного ответа, так что я могу динамически устанавливать некоторые начальные значения и некоторые обработчики событий для списка.

настоящее время я использую следующий код, который не делает трюк:

responsePromise.success(function (data, status, headers, config) { 
    var slideInfos = data; 
    $scope.slideInfos = slideInfos; 
    setInitialSliderValues(); 
}); 

В то время я называю setInitialSliderValues ​​() вид еще не обновляется.

При попытке использования следующим я получаю сообщение об ошибке «$ дайджеста уже в процессе»:

responsePromise.success(function (data, status, headers, config) { 
    var slideInfos = data; 
    $scope.$apply(function() { 
     $scope.slideInfos = slideInfos ; 
     setInitialSliderValues(); 
    } 
}); 

Как я могу быть абсолютно уверен, что изменения в данных вступили в силу на странице без использования таймер, который проверяет изменения, которые я ожидаю.

+0

Используйте '$ таймаут (функция() { setInitialSliderValues ​​();} )' вызывается точным после текущего дайджеста цикла закончить –

+0

вы используете 'Jquery ajax' внутри углового? –

ответ

6

Используйте $timeout(), который будет запущен в следующем цикле дайджеста. Не забудьте добавить $timeout зависимости от контроллера.

$timeout(function() { 
    $scope.slideInfos = slideInfos ; 
    setInitialSliderValues(); 
}); 
+0

Должен ли я удалить этот таймаут или он запускается только один раз, когда не определено время? – Galya

+0

@Galya он будет запускаться только один раз, если он равен $ interval, тогда вам нужно очистить его вручную. –

+1

$ timeout вызовет еще один цикл дайджеста. используйте $ timeout (fn, 0, false) – Gerfried

1

Вы можете попробовать использовать $ evalAsync:

responsePromise.success(function (data, status, headers, config) { 
    $scope.slideInfos = data; 
    $scope.$evalAsync(function() {   
     setInitialSliderValues(); 
    } 
}); 

В отличии от $ тайма-аута, он будет пытаться стрелять в том же переваривать цикл, если это возможно, если не будет решен в следующем дайджесте цикле.

+0

Это хороший трюк, но это не будет ответом в моем случае, потому что это происходит очень быстро (запрос ajax завершается, когда рендеринг всей страницы все еще продолжается), а текущий рабочий дайджест не является тем Я жду (или, по крайней мере, я предполагаю, что это не работает). – Galya

+0

@kjell Ivar AFAIK '$ timeout' и' $ evalAsyc' оба работают одинаково, только $ timeout отличается, потому что мы можем сказать, чтобы запустить цикл дайджеста через определенный промежуток времени ... Исправьте меня, если я ошибаюсь .. –

+0

Он будет разрешен в конце дайджеста, так как он помещается в очередь Async. Вы попробовали? @pankajparkar они не работают одинаково. Вы можете подробнее узнать о различиях здесь: http://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm –