Подтвердить что ты не робот

Angular ui-router: получить информацию о состоянии состояния toState в разрешении

Обновить: это должно быть возможно в angular -ui-router по 1.0.0alpha0. См. Примечания к выпуску https://github.com/angular-ui/ui-router/releases/tag/1.0.0alpha0 и проблема https://github.com/angular-ui/ui-router/issues/1018, которую я создал.

Я хотел бы получить доступ к имени состояния и другим атрибутам, которые приложение выполняет при использовании angular ui-router при работе над решением.

Причина: я хочу асинхронно загружать некоторые пользовательские данные (включая их права доступа), прежде чем разрешить приложению вводить эту страницу.

В настоящее время это невозможно, потому что ввод значения $state в точку разрешения указывает на состояние, в котором вы перемещаете форму, а не на ту, к которой вы переходите.

Я знаю, что могу:

  • получить toState в другом месте с помощью $rootScope ('$ stateChangeStart') и сохранить его в моей службе настроек, например. Но я думаю, что это немного грязно.
  • жестко закодировать состояние в разрешении, но я не хочу повторно использовать мое решение для всех страниц

Я также создал проблему с ui-router github (пожалуйста, + 1, если вам интересно!): https://github.com/angular-ui/ui-router/issues/1018

Вот мой код до сих пор. Любая помощь ценится!

.config(function($stateProvider) {

    $stateProvider.state('somePage', {
        // ..
        resolve: {
            userData: function($stateParams, $state, Settings) {
                return Settings.getUserData() // load user data asynchronously
                    .then(function (userData) {
                        console.log($stateParams);
                        console.log($state);
                        // Problem: $state still points to the state you're navigating away from
                    });
            }
        }
    });
});
4b9b3361

Ответ 1

Обновление для Ui-Router 1.x

$provide.decorator('$state', ($delegate, $transitions) => {
    $transitions.onStart({}, (trans) => {
      $delegate.toParams = trans.params()
      $delegate.next = trans.to().name
    })
    return $delegate
  })

Ui-Router 0.x

Вы всегда можете украсить $state свойствами next и toParams:

angular.config(function($provide) {
  $provide.decorator('$state', function($delegate, $rootScope) {
    $rootScope.$on('$stateChangeStart', function(event, state, params) {
      $delegate.next = state;
      $delegate.toParams = params;
    });
    return $delegate;
  });
});

И используйте как таковой:

.state('myState', {
    url: '/something/{id}',
    resolve: {
        oneThing: function($state) {
            console.log($state.toParams, $state.next);
        }
    }
});

Ответ 2

Итак, я сам открыл ответ. Если вы используете код как мой, объект $stateParams правильно вводится, но $state является пустым (или старым) объектом состояния.

Для меня работала ссылка this в функции разрешения:

.state('myState', {
    url: '/something/{id}',
    templateUrl: '/myTemplate.html',
    controller: function() {},
    resolve: {
        oneThing: function($stateParams) {
            console.log($stateParams); // comes through fine
            var state = this;
            console.log(state); // will give you a "raw" state object
        }
    }
})

Первый журнал вернет то, что вы ожидаете. Второй журнал возвращает "состояние" (из-за отсутствия лучшего термина) объекта состояния. Так, например, чтобы получить имя состояния, вы можете получить доступ, this.self.name.

Я понимаю, что это не предпочтительнее... было бы намного приятнее, если $state (или другой стандартизованный объект) мог бы предоставить эту информацию для нас при решении, но это лучшее, что я мог найти.

Надеюсь, что это поможет...

Ответ 3

this.toString() предоставит вам имя состояния