Почему ng-show переходит в бесконечный цикл при выполнении асинхронного вызова в angularjs?

Я диагностировал проблему использования 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;

};

Он продолжает выводить следующее в бесконечном цикле:

  1. Успех
  2. Некоторые данные верны ‹- логическое значение true
  3. тестирование
  4. true ‹ -- Boolean Значение true
  5. false ‹- логическое значение false

Однако я подозреваю, что, печатая false в конце, он не возвращает false; ничего не возвращает.

Когда я переключаю ng-show на ng-init следующим образом:

<div ng-init="isRegistered()"></div>

Я получаю вывод без бесконечного цикла:

  1. ЛОЖЬ
  2. Успех
  3. Некоторые данные верны
  4. тестирование
  5. истинный

Таким образом, с помощью ng-init кажется, что он возвращает глобальный $scope.test значение true, следовательно, он завершается. С ng-show из-за характера асинхронных вызовов gapi и, возможно, просто из-за характера ng-show, хотя я запрашиваю возвращаемое значение, он никогда ничего не возвращает. Я не знаю, почему.

Однако я сбит с толку, потому что тело функции joe() - асинхронный вызов gapi - по-видимому, успешно вызывается асинхронно, но тело функции isRegistered() никогда не "знает", что оно выполнено - отсюда и этот цикл.

Как я могу сообщить isRegistered()/ng-show, что асинхронный вызов gapi выполнен и возвращает либо true, либо false, а НЕ постоянно оставаться в этом состоянии бесконечного цикла. Мне кажется, судя по тому, как я его закодировал, он никогда ничего не возвращает. Как сделать так, чтобы isRegistered() возвращал либо true, либо false в зависимости от возврата асинхронного вызова gapi?


person vama89    schedule 12.08.2015    source источник
comment
То, что вы делаете, бессмысленно, когда все, что вам нужно сделать, это установить переменную области видимости и передать ее ng-show. Нужно прочитать, как работают циклы дайджеста angular. ng-show ожидает синхронное выражение, а не обещание, и это обещание отличается от каждого дайджеста, вызывая больше дайджестов.. следовательно, бесконечный цикл   -  person charlietfl    schedule 12.08.2015
comment
Бессмысленно только потому, что я застрял, пытаясь инициализировать эту страницу через асинхронный вызов. Единственный способ, которым я мог это сделать, был с ng-init, и этот метод также не работал, когда я обновлял страницу, поэтому я попробовал этот хакерский способ с ng-show, но теперь я знаю, что он ожидает только синхронное выражение от то, что вы только что прокомментировали. Спасибо хоть за этот термин дайджест циклов. Я буду помнить об этом при отладке этой штуки.   -  person vama89    schedule 12.08.2015
comment
я думаю, что лучший ответ находится на stackoverflow.com/questions/20913569/   -  person shereifhawary    schedule 30.05.2016