Ember.js 从嵌套管线获取参数值

Ember.js 从嵌套管线获取参数值,ember.js,Ember.js,我的路由器设置如下: this.resource('analytics', {path: '/analytics'}, function(){ this.resource('analyticsRuns', {path: ':exerciseRunId/analyticsRuns'},function(){ this.resource('analyticsRun',{path: ':runId'}); }); }); 我使用以下方法跳转到“分析运行”路线: thi

我的路由器设置如下:

this.resource('analytics', {path: '/analytics'}, function(){
    this.resource('analyticsRuns', {path: ':exerciseRunId/analyticsRuns'},function(){
        this.resource('analyticsRun',{path: ':runId'});
    });
});
我使用以下方法跳转到“分析运行”路线:

this.transitionToRoute('analyticsRuns',{"exerciseRunId":this.get('selectedExerciseRun.id')});
我的分析路线定义为:

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'));
}
}))

我想知道是否可以访问AnalyticsRunIndexRoute中的“:exerciseRunId”值。当前,当我检查传递到此routes模型的参数时,没有设置任何内容。然而,在刷新时,该参数对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'));
}
});

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

this.transitionToRoute('analyticsRuns',this.get('selectedExerciseRun'));
当您从一个路由转换到另一个路由时,将跳过
模型
钩子,因此您必须在
转换路由
或链接到中传递活动对象

[更新]针对评论:

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

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

嗨,杰里米,谢谢你的回复。为了给你更多关于这个问题的上下文,selectedExerciseRun不是子对象id,它只是我必须使用的一个筛选条件(对于posts->post-ember示例中的reg.in post_id这里不是selectedExerciseRun.id)。因此,在您建议的更改之后,url看起来像analytics/[object]/analytics。请参阅我原始答案的[UPDATE]。感谢您与我一起处理此Jeremy。您提供的更新代码正是我在“AnalyticsRunIndexRoute.model”中使用的代码。这是可行的,但当用户刷新页面时,他/她将不得不重定向到索引页面,因为“selectedExerciseRun.id”丢失,这是我希望id成为URL的一部分的主要原因,因此,即使用户刷新页面,我也可以向他/她显示按id过滤的分析列表。在页面刷新的情况下,您将使用
模型
挂钩来设置对象。当跳过从路由到路由的转换
model
时,您必须将要使用的模型传递到
transitionontoroute
调用。当您直接键入URL(与页面刷新相同)时,将调用
model
hook。您必须考虑这两种情况。在
AnalyticsRunsIndexRoute
中,您可以使用
this.modelFor('analyticsRuns')
访问模型本身。您希望在
AnalyticsRunsRoute
模型中返回正确的内容。