Я диагностировал проблему использования ng-show при использовании асинхронного вызова, в частности, с использованием клиентских библиотек Google javascript — gapi.
У меня есть это на моих страницах partials/html в моем угловом приложении. Я буду использовать ng-show следующим образом. Здесь я вызываю ng-show:
<div ng-show="isRegistered()"></div>
При запуске моей батареи тестов ng-show НЕ входит в бесконечный цикл, когда я просто выполняю обратный вызов некоторого логического значения. Например:
$scope.isRegistered = function () {
$scope.test = false;
return $scope.test;};
Кроме того, нет НЕТ бесконечного цикла, когда я захожу в другую функцию и переключаю $scope.test на true или false на неопределенный срок, скажем, простым флажком.
Проблема этого бесконечного цикла начинается, как только мой возврат зависит от некоторого типа асинхронного вызова, подобного этому:
$scope.isRegistered = function () {
$scope.test=false;
var joe = function () {
var deferred = $q.defer();
gapi
.client
.conference
.isRegistered()
.execute(function (res) {
$scope.$apply(function () {
if (res.error) {
$log.error('There was an Error');
deferred.reject(res.error);
}
else {
$log.info("Success");
deferred.resolve(res.data);
}
});
});
return deferred.promise;
};
joe()
.then(function (data) {
$log.info("Got some data", data);
$log.info("testing");
$scope.test = data;
$log.info($scope.test);
});
$log.info($scope.test);
return $scope.test;
};
Он продолжает выводить следующее в бесконечном цикле:
- Успех
- Некоторые данные верны ‹- логическое значение true
- тестирование
- true ‹ -- Boolean Значение true
- false ‹- логическое значение false
Однако я подозреваю, что, печатая false в конце, он не возвращает false; ничего не возвращает.
Когда я переключаю ng-show на ng-init следующим образом:
<div ng-init="isRegistered()"></div>
Я получаю вывод без бесконечного цикла:
- ЛОЖЬ
- Успех
- Некоторые данные верны
- тестирование
- истинный
Таким образом, с помощью ng-init кажется, что он возвращает глобальный $scope.test значение true, следовательно, он завершается. С ng-show из-за характера асинхронных вызовов gapi и, возможно, просто из-за характера ng-show, хотя я запрашиваю возвращаемое значение, он никогда ничего не возвращает. Я не знаю, почему.
Однако я сбит с толку, потому что тело функции joe() - асинхронный вызов gapi - по-видимому, успешно вызывается асинхронно, но тело функции isRegistered() никогда не "знает", что оно выполнено - отсюда и этот цикл.
Как я могу сообщить isRegistered()/ng-show, что асинхронный вызов gapi выполнен и возвращает либо true, либо false, а НЕ постоянно оставаться в этом состоянии бесконечного цикла. Мне кажется, судя по тому, как я его закодировал, он никогда ничего не возвращает. Как сделать так, чтобы isRegistered() возвращал либо true, либо false в зависимости от возврата асинхронного вызова gapi?
ng-show
. Нужно прочитать, как работают циклы дайджеста angular.ng-show
ожидает синхронное выражение, а не обещание, и это обещание отличается от каждого дайджеста, вызывая больше дайджестов.. следовательно, бесконечный цикл - person charlietfl   schedule 12.08.2015