在我的 API 和服务器上,我有一个这样的模型层次结构:
锻炼计划->锻炼->锻炼
我可以使用 DS.hasMany 关系成功加载该结构。
但是,我的客户端视图将计划分解为数周,因此最好有一个客户端模型结构
锻炼计划->周->锻炼->锻炼
如果周不是 ember 数据模型,是否可以这样做?
如果不是,我是否应该只转换我的 JSON,以便我可以在周模型上拥有一个 hasMany(锻炼有一个周列,我可以将其用作周模型的准 id)。
或者最好保留当前的模型结构,并以某种方式按周过滤锻炼。
在我的 API 和服务器上,我有一个这样的模型层次结构:
锻炼计划->锻炼->锻炼
我可以使用 DS.hasMany 关系成功加载该结构。
但是,我的客户端视图将计划分解为数周,因此最好有一个客户端模型结构
锻炼计划->周->锻炼->锻炼
如果周不是 ember 数据模型,是否可以这样做?
如果不是,我是否应该只转换我的 JSON,以便我可以在周模型上拥有一个 hasMany(锻炼有一个周列,我可以将其用作周模型的准 id)。
或者最好保留当前的模型结构,并以某种方式按周过滤锻炼。
您的 ember 模型不必模仿您的服务器模型。通常有充分的理由去规范化、最小化数据量和简化模型。例如,服务器处理多个用户,您的 ember 应用程序可能只关注一个。
我在这里看到两个选项。我对您的模型知之甚少,无法建议最好的模型。
一般来说,我会走向 1,但正如我所说,我对你的模型知之甚少,无法为任何一个提供强有力的理由。
更新。展开 2
这有两个部分。第一个是 WeekPlanRoute。这可能类似于以下内容。它基本上负责创建一个 Weeks 数组并使用它将其传递给 WorkoutRoute/Controller
App.WeekPlaneRoute = Ember.Route.extend({
model: function(){
// assuming we already have a WorkoutPlan
return workoutPlan.workouts.mapBy('week');
},
);
然后,您可以使用将一周作为参数传递的链接导航到锻炼:
{{#each}}
{{#link-to 'workouts.index' this}}{{/link-to}}
{{/each}}
在您的 WorkoutRoute 中,您将使用该参数进行过滤:
Todos.WorkoutRoute = Ember.Route.extend({
model: function(params){
// assuming we already have a WorkoutPlan
return workout.filterBy(params.weekNumber);
}
);
您还必须更改路线以添加 weekNumber 的动态段(它必须与上面使用的参数匹配)。
this.resource('workouts', {path: '/workouts/:weekNumber'});