@Devate

Как внедрить сервис с promise в scope и не нарваться на Infinite $digest Loop?

Здравствуйте!

Никак не могу решить одну проблему :( Стоит задача: сделать ACL. Список разрешений загружается с сервера. Далее я проверяю - есть ли доступ к такому-то ресурсу у пользователя, просматривая полученный список. Для удобства работы внедряю созданный сервис в scope в виде вызова динамической функции, проверяющей имеет ли юзер право доступа к ресурсу. Так как без промиса я здесь работать никак не могу (всё-таки данные идут с сервера) - при его возврате и работе со scope вполне заслуженно получаю ошибку Infinite $digest Loop. Но никак не могу понять - как её обойти?

Даже если упростить пример до простейшего уровня:

module.factory('ACL', function ($q) {
  return {
    access: function () {
      return $q.when(true);
    }
  };
});

$rootScope.access = ACL.access;


и во вьюхе прописать:

<div ng-if="access()"></div>

Нарываюсь на ошибку :( Как быть?
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
@Devate Автор вопроса
Реализовать задачу можно примерно так:

module.service('ACL', function () {
  var self = this;

  // Разрешения.
  self.permissions;

  // Инициализация списка разрешений.
  promise.then(function (data) {
    self.permissions = ...;
  });

  // Проверка доступа.
  self.access = function (permission) {
    if (angular.isDefined(self.permissions)) {
      return permission in self.permissions;
    }
  };
});


Использование:

<div ng-if="::access('permission')"></div>

Николай: Спасибо, за помощь в поиске данного решения!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Вы понимаете, что даже если бы ангуляр не уходил в бесконечный digest вы значение true не получили бы?
Сделайте в котроллере вашей вьюшки какое-то свойство, которое будет как-то так инициализироваться:
access().then(function(data) {
    if (data.foo) {
         vm.hasAccess = true;
    }
});

Если запрос выполняется при переходе в этот route/state - можно перенести всё в resolve.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы