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 }); } } }); });
你总是可以使用next
和toParams
属性来装饰$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()会给你的状态名称