混合余烬数据和非余烬数据模型

时间:2013-11-07 15:13:25

标签: ember.js ember-data

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

WorkoutPlan-> workouts->练习

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

但是,我的客户端视图将计划分解为数周,因此建立客户端模型结构会很好

WorkoutPlan->周 - > workouts->练习

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

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

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

1 个答案:

答案 0 :(得分:1)

您的ember模型不必模仿您的服务器型号。通常有很好的理由去标准化,最小化数据量并简化模型。例如,服务器处理多个用户,您的ember应用程序可能只涉及一个。

我在这里看到两个选项。我对你的模型知之甚少,没有提出什么是最好的。

  1. 将WeekPlan添加为模型。您可以更改服务器中的序列化逻辑(如果您有特定于应用程序的API)或在序列化客户端期间更改此值(如果此更改对其他API使用者没有意义)。
  2. 在运动路由器中添加过滤器。此外,你可以拥有一个带有周的ArrayController,它只是聚合锻炼计划中锻炼的周数。
  3. 一般情况下,我会指向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'});