angular ui-router:在解析中获取toState的$ state状态信息

Jon*_*upp 46 javascript angularjs angular-ui angular-ui-router

更新:这应该可以在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 I创建.

在处理解决方案时,我想访问应用程序导航到使用角度ui-router的状态名称和其他属性.

原因是:我想在允许应用程序输入该页面之前异步加载一些用户数据(包括其访问权限).

目前这是不可能的,因为将$ state注入解决点指向您正在导航的状态,而不是您要导航到的状态.

我知道我可以:

  • 使用$ rootScope('$ stateChangeStart')在其他地方获取toState并将其保存在我的设置服务中.但我觉得它有点乱.
  • 硬编码状态进入决心,但我不想重复我的决心所有页面

我还在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
                    });
            }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

Tay*_*Mac 56

Ui-Router 1.x的更新

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

Ui-Router 0.x

您可以随时$state使用nexttoParams属性进行装饰:

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;
  });
});
Run Code Online (Sandbox Code Playgroud)

并使用如下:

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


Nat*_*man 31

所以我自己发现了答案.如果您的代码行为与我的相似,则会正确注入$ stateParams对象,但$ state是一个空(或旧)状态对象.

对我this有用的是在resolve函数中引用:

.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
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

第一个日志将返回您期望的内容.第二个日志将返回"原始"(缺少更好的术语)状态对象.因此,例如,要获取州名称,您可以访问,this.self.name.

我意识到这不是首选...如果$state(或另一个标准化对象)可以为我们提供此信息,那将会更好,但这是我能找到的最好的.

希望有帮助......

  • 当您将解析包含在抽象(父)状态时,此方法似乎会中断.你期望`$ state`成为扩展状态,但是`this`会返回父状态.我不知道如何解决这个问题,或者如果可行的话.尽管如此,我想我会把我的发现添加到这个决议:) (6认同)
  • 它对我不起作用.'this'里面的resolve函数只是window对象. (3认同)