编辑更多细节

我确定是新手问题。我正在尝试做一些我认为很简单的事情,但是我什么也没做。

基本上,我有一个带有多个子状态的父状态。我想在父状态的解析中加载一些数据,以便所有子状态都可以使用。为此,我需要传递给子状态的参数(上下文)可用。我通过$state.params得到它。代码(为清晰起见,省略了一些代码)是这样的:

.state('pbr', {
    url: "/pbr",
    templateUrl: "pbr/pbr.html",
    controller: "pbrBaseCtrl",
    abstract: true ,
    resolve: {
        dpts: function(NavDPT, $state) {
               return NavDPT.query({context: $state.params.context}).$promise;
              }
        }

})
.state('pbr.review', {
        url: "/review/{context}?div",
        templateUrl: "pbr/pbr-review.html",
        controller: "pbrReviewCtrl"
    })


据我了解,$state.params应该包含传递给父状态和子状态的参数,而$stateParams仅具有活动状态的参数。

无论如何,我看到的是$state.params在解析发生之前没有被填充,因此数据获取失败。它最终确实会被填充。我似乎无法找到一种方法来等待$state.params在获取数据之前可用。我试图在超时中包装东西,等等。

我尝试改为使用查询参数,并在父级指定了查询参数,并且观察到了相同的行为-当解析发生时,newcontext尚不可用。

 .state('pbr', {
            url: "/pbr?newcontext",
            templateUrl: "pbr/pbr.html",
            controller: "pbrBaseCtrl",
            abstract: true ,
            resolve: {
                dptsResource: 'NavDPT',
                dpts: function(dptsResource, $state, $log) {
                    $log.info("state.params is also ",$state.params);
                    return dptsResource.query({context: $state.params.newcontext}).$promise;
                }
            }

        })


谢谢。

最佳答案

an example显示了即使在$stateParams函数中也可以访问resolve的方法,但是必须在当前或父状态(而不是在子状态)下定义它们

因此,这些是状态:

  $stateProvider
    .state('pbr', {
        // we define 2 params oldContext and newContext
        url: "/pbr/{oldContext}?newContext",
        ...
        resolve: {
            // here we can get all params defined for our state
            dpts: function($state, $stateParams) {
                return {
                  oldContext : $stateParams.oldContext,
                  newContext : $stateParams.newContext,
                }
            }
        }
    })
    // child will have even the context as 3rd param
    .state('pbr.review', {
      url: "/review/{context}",
      ...
    })


这些是调用它们的方法:

// via ui-sref
ui-sref="pbr.review({oldContext: 'abc1', newContext : 'def1', context : 'xyz1'})"
ui-sref="pbr.review({oldContext: 'abc2', newContext : 'def2', context : 'xyz2'})"

// via href
href="#/pbr/abc1/review/xyz1?newContext=def1"
href="#/pbr/abc2/review/xyz2?newContext=def2"


plunker中观察更多

关于angularjs - Angular ui路由器并从父级访问子状态参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24301754/

10-17 02:33