从嵌套路由获取参数值

时间:2013-09-25 21:21:18

标签: ember.js

我的路由器设置如下:

this.resource('analytics', {path: '/analytics'}, function(){
    this.resource('analyticsRuns', {path: ':exerciseRunId/analyticsRuns'},function(){
        this.resource('analyticsRun',{path: ':runId'});
    });
});

我使用以下方式跳转到'analyticsRuns'路线:

this.transitionToRoute('analyticsRuns',{"exerciseRunId":this.get('selectedExerciseRun.id')});

我的AnalyticsRunsIndexRoute定义为:

AS.AnalyticsRunsIndexRoute = Ember.Route.extend({
model : function(params) {
    var store = this.get('store');
     //console.log(params); //returns empty object
    //var exerciseRunId = AS.Analytics.get('exerciseRunId');
    exerciseRunId = 577;
    if(!(exerciseRunId)){
        this.transitionTo('analytics');
    }

    store.find('analyticsRun',{'exerciseRunId':exerciseRunId});
    return store.filter('analyticsRun', function(analyticRun){
        return analyticRun.get('exerciseRunId') == exerciseRunId;
    });


},
setupController : function(controller,model){
    this._super(controller,model);
    this.controllerFor('analysisTemplates').set('model',controller.get('store').find('analysisTemplate'));
}

});

我想知道我是否可以在AnalyticsRunsIndexRoute中访问“:exerciseRunId”值。当我检查传递给此路由模型的params参数时,目前没有任何设置。但是,在刷新时,该参数可用于AnalyticsRunRoute,但仅在刷新时。那么我必须使用stateManagement来获取参数值吗?或者是否有更简单的方法来访问它。感谢。

解决方案:

再一次非常感谢杰里米走过这一步。以下是我现在设置的方法:

我违抗了以下路线:

AS.AnalyticsRunsRoute = Ember.Route.extend({
model : function(params) {
    return params;
}
});


AS.AnalyticsRunsIndexRoute = Ember.Route.extend({
model : function(params) {
    var parentModel = this.modelFor('analyticsRuns');
    var exerciseRunId = AS.Analytics.get('exerciseRunId')||parentModel.exerciseRunId;
    var store = this.get('store');

    if(!(exerciseRunId)){
        this.transitionTo('analytics');
    }

    store.find('analyticsRun',{'exerciseRunId':exerciseRunId});
    return store.filter('analyticsRun', function(analyticRun){
        return analyticRun.get('exerciseRunId') == exerciseRunId;
    });

},
setupController : function(controller,model){
    this._super(controller,model);
    this.controllerFor('analysisTemplates').set('model',controller.get('store').find('analysisTemplate'));
}
});

1 个答案:

答案 0 :(得分:0)

调用transitionToRoute时,您应该传递一个活动对象。

this.transitionToRoute('analyticsRuns',this.get('selectedExerciseRun'));

当您从路线转换到路线时,会跳过model挂钩,因此您必须在transitionToRoutelink-to中传递实时对象。

[更新]回复评论:

如果selectedExcerciseRun不是活动对象,则需要在转换之前实例化实时对象。像这样:

var runId = this.get('selectedExerciseRun.id');
var promise = store.find('analyticsRun',{'exerciseRunId':runId});
promise.then(function(analyticsRun){
  this.transitionToRoute('analyticsRun',analyticsRun);
});