Как ассинхронно менять переменную в angular?

Обычно делала так:

var app = angular.module('myApp', []).controller('myCtrl', ['$scope', function($scope) {
  $scope.authorizedApp = false;

  $scope.example = function () {
  $scope.authorizedApp = true; //так меняла значения переменных
}
}]);

И уже в шаблоне можно было пользоваться всякими директивами (ng-if и т.д.).
Но сейчас работаю с api фэйсбука. и там куча ассинхронных вызовов.

Видимо, ассинхронные функции пока выполняются (внутри этих функций я меняю переменную $scope.authorizedApp ), а мой шаблон уже подгрyзился и $scope.authorizedApp берет глобальное значение.

Что можно придумать?
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
@Drm
Для асинхронных запросов стоит использовать так называемые обещания (promice), в ангуляре они есть в библиотеке $q
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
mannaro
@mannaro Куратор тега JavaScript
Умею профессионально гуглить
$scope.$digest();

в конце вызывай и будет тебе счастье)
Ответ написан
Комментировать
DigitalSmile
@DigitalSmile
http://brainstorage.me/digitalsmile
Из очевидных решений для меня, не использовать глобальные переменные. У Вас одно значение протаскивается по наследованию во всех контроллерах?
Ответ написан
Комментировать
iKapex
@iKapex Автор вопроса
Библиотека $q - действительно, то что нужно.
Делается это так:
$scope.example = function (value) { 
  var q = $q.defer();
  if (value == 'what_you_need') {
     q.resolve(variable); //подставляете в variable значение, которое вам надо
  }
  else {
    q.reject(variable);  //подставляете в variable значение, которое вам надо в противных случаях     
  }
  return  q.promise;
}


и уже в callbackе создаете такую цепочку:

$scope.auth = false;  //эта переменная и примет значение, когда callback отработает
$scope.promise = $scope.example(your_variable);
    $scope.promise.then ( function (v) { $scope.auth = v },
                          function (err) { $scope.auth = err }                 
        								)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы