angular ui-router:获取toState的$ state信息

更新 :这应该是可能的1.0.0alpha0从angular-ui路由器。 请参阅发行说明https://github.com/angular-ui/ui-router/releases/tag/1.0.0alpha0和问题https://github.com/angular-ui/ui-router/issues/1018 I创build。

我想访问状态的名称和应用程序正在导航到使用angular度ui路由器时的解决scheme的其他属性。

原因是:我想在允许应用程序进入该页面之前asynchronous加载一些用户数据(包括他们的访问权限)。

目前这是不可能的,因为注入$ state到parsing点指向你正在导航的状态,而不是你正在导航的状态。

我知道我可以:

  • 用$ rootScope('$ stateChangeStart')把toState放到别的地方,然后把它保存在我的设置服务中。 但是我觉得有点混乱
  • 硬编码的状态进入决心,但我不想重复我的决心所有网页

我也在ui-router github上创build了一个问题(如果你感兴趣的话,请加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 }); } } }); }); 

你总是可以使用nexttoParams属性来装饰$state

 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); } } }); 

所以我自己也find了答案 如果代码的行为与我的一样,$ stateParams对象被正确注入,但是$ state是一个空的(或旧的)状态对象。

什么对我来说是在parsing函数中引用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 (或另一个标准化的对象)可以为我们提供这个信息,那么这将是一个更好的select,但这是我能find的最好的。

希望有帮助…

this.toString()会给你的状态名称