Обновление данных из сервиса в контроллере

0

У меня есть два отдельных контроллера: AuthController и NavController. AuthController несет ответственность за регистрацию/регистрационную форму, а NavController отвечает за отображение навигационной панели, где я хочу показать текущее имя пользователя, если вы вошли в систему. Наконец, у меня есть служба "auth", которая обрабатывает все, что регистрирует/регистрирует материал

служба auth имеет эту функцию:

auth.currentUser = function() {
  if (auth.isLoggedIn()) {
    var token = auth.getToken();
    var payload = this.decodeUsername(token);

    return payload.username;
  }
};

и NavController выглядит так:

app.controller('NavController', ['$scope', 'auth',
function($scope, auth) {
    $scope.isLoggedIn = auth.isLoggedIn;
    $scope.logOut = auth.logOut;
    $scope.currentUser = auth.currentUser();
}
]);

Поэтому я могу отображать текущее имя пользователя, но если пользователь только что вошел в NavController, "не знает", что все изменилось. Я попытался использовать событие, но у этих двух контроллеров нет отношения родитель-потомок. Должен ли я обернуть их в один родительский контроллер и сделать "AuthController-emit-> SuperController-broadcast-> NavController", или есть лучший способ установить там два контроллера?

  • 0
    Возможный дубликат Angular: Обмен данными между контроллерами
  • 0
    @isherwood AFAIK это будет работать только со свойством сервиса, но я здесь использую метод получения
Теги:

2 ответа

0
Лучший ответ

У вас есть два варианта:

Используйте $rootScope.broadcast (пример здесь), и это отправит событие сверху вниз каждому контроллеру. Это лучше всего работает, если несколько вещей захотят увидеть это сообщение.

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

В вашей службе авторизации есть функция, которая вызывается при изменении состояния, например

authApi.stateChange = function() {}

В вашем контроллере навигационной панели вы затем установите authApi.stateChange = $scope.authUpdated; и тогда ваша функция authUpdated будет уведомлена из службы при authApi.stateChange()

  • 0
    $ rootScope.broadcast работает хорошо. Спасибо.
0

Когда есть что-то, что можно использовать между контроллерами, Служба наилучшим образом обеспечит результат. В качестве своего синглтона будет только один экземпляр, а ваши контроллеры - "Auth" - могут устанавливать/обновлять значение, "Nav" может привязываться к изменениям.

Если есть какая-то выборка, используйте обещание. И если данные будут собираться только один раз, тогда вам будет лучше, просто используя обещание.

        auth.currentUser = function() {
           var defer = $q.defer();
           if (auth.isLoggedIn()) {
              var token =  //some asynoperation//;
              var payload = this.decodeUsername(token);

              defer.resolve(payload.username);
           }else{
              defer.reject("Not logged in");
           }

           return defer.promise;
};

(//не забудьте ввести $ q)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню