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
的模型中返回正确的内容。