0

在我的 API 和服务器上,我有一个这样的模型层次结构:

锻炼计划->锻炼->锻炼

我可以使用 DS.hasMany 关系成功加载该结构。

但是,我的客户端视图将计划分解为数周,因此最好有一个客户端模型结构

锻炼计划->周->锻炼->锻炼

如果周不是 ember 数据模型,是否可以这样做?

如果不是,我是否应该只转换我的 JSON,以便我可以在周模型上拥有一个 hasMany(锻炼有一个周列,我可以将其用作周模型的准 id)。

或者最好保留当前的模型结构,并以某种方式按周过滤锻炼。

4

1 回答 1

1

您的 ember 模型不必模仿您的服务器模型。通常有充分的理由去规范化、最小化数据量和简化模型。例如,服务器处理多个用户,您的 ember 应用程序可能只关注一个。

我在这里看到两个选项。我对您的模型知之甚少,无法建议最好的模型。

  1. 添加 WeekPlan 作为模型。您可以更改服务器中的序列化逻辑(如果您有特定于应用程序的 API)或在序列化客户端期间更改此逻辑(如果此更改对其他 API 使用者没有意义)。
  2. 在您的锻炼路由器中添加过滤器。你也可以有一个带有周数的 ArrayController,它只是在锻炼计划中汇总锻炼的周数。

一般来说,我会走向 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'});
于 2013-11-08T01:15:24.863 回答