角度ui-router和从父级访问子状态参数

时间:2014-06-19 08:13:04

标签: angularjs angular-ui-router

使用更多详情进行编辑

新手问题,我相信。我正在尝试做一些我认为会直截了当的事情,但我没有得到任何结果。

基本上,我有一个有多个子州的父州。我想在父状态的解析中加载一些数据,以便它可供所有子状态使用。为此,我需要一个传递给子状态的参数(上下文)可用。我是通过$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;
                }
            }

        })

感谢。

2 个答案:

答案 0 :(得分:5)

an example显示我们如何在$stateParams函数中访问resolve,但必须在当前 parent <中定义它们/ em>州 (不在孩子身上)

所以,这些是州:<​​/ p>

  $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

中观察更多内容

答案 1 :(得分:0)

只需在父级别定义params即可。然后,您将可以在父级和子级上访问它们。

<强> PARENT:

{
    state: 'modal',
    config: {
        url: '/modules?person_id&encounter_id',
        controller: 'ModalController',
        controllerAs: 'vm',
        templateUrl: 'app/modal/views/modal.html',
        abstract: true
    }
}

儿童:

{
    state: 'modal.micro',
    config: {
        url: '/micro',
        controller: 'MicroController',
        controllerAs: 'vm',
        templateUrl: 'app/micro/views/micro.html'
    }
}

从模式CTRL访问(示例):

if (condition) {
    vm.currentPerson = _.find(DashboardModel.pane1Data.DATA_REC.DATA_LIST, function (person) {
        return person.PERSON_ID == $stateParams.person_id;
    });
}

从儿童CTRL访问(示例):

if (condition) {
    vm.currentPerson = _.find(DashboardModel.pane1Data.DATA_REC.DATA_LIST, function (person) {
        return person.PERSON_ID == $stateParams.person_id;
    });
}