嵌套路由导致数据重新加载/替换?

时间:2013-08-30 05:00:05

标签: ember.js

在emberjs论坛上发布此内容,但似乎更合适。

嗨!我有两条叫做classyears和classyear的路线。它们是这样嵌套的:

this.resource('classyears', function(){
    this.resource('classyear', { path: '/classyear/:classyear_id'});
});

Posterkiosk.ClassyearsRoute = Ember.Route.extend({
  model: function() {
    return Posterkiosk.Classyear.find();
  }
});

Posterkiosk.ClassyearRoute = Ember.Route.extend({
  model: function(model) {
    return Posterkiosk.Classyear.find(model.classyear_id);
  }
});

我的模板是:

Classyears:

<div class="yearList">
{{#each item in model}}
    {{#linkTo 'classyear' item}}{{item.id}}{{/linkTo}}
{{/each}}
</div>
{{outlet}}

Classyear:

<div class="transformContainer">
    {{trigger sizeComposites}}
    {{name}}
    {{#each students}}
      {{partial student}}
    {{/each}}
</div>

(“触发器”助手来自另一个SO帖子。问题是在添加之前发生的)

我正在使用Ember模型RESTAdapter。当我加载/ classyear /:classyear_id时,看起来classyear正在渲染其数据两次。一次使用正确加载的数据,一次没有加载数据。订单似乎是随机的。如果最后发生无数据选项,则会清除正确加载的数据,留下空白页。反之亦然,页面内容显示得很好。

有什么想法吗?

/编辑2:更多信息:

看起来0记录的回复来自classyears loading。因此,在我的hasMany字段“学生”中,零记录回复可能实际上只是零记录。

如果我加载/ classyears(没有指定类年),它只加载一次,以获得class year选项。如果我然后点击一年级,它不会重新加载classyears,除非我刷新页面,此时它加载两者,如果classyears加载(一个findall)完成第二次,它在页面上不显示任何数据(其他比classyears模板,正确填充,在顶部)。

所以...也许我的classyears模型没有正确处理hasMany字段?

我觉得我越来越近,但仍然不确定是什么。

1 个答案:

答案 0 :(得分:1)

首先,您需要为Student指定模型,如下所示:

Posterkiosk.Student = Ember.Model.extend({
  id: Ember.attr(),
  name: Ember.attr(),
  imageUrl: Ember.attr(),
  gradyear: Ember.attr()
});

Posterkiosk.Student.adapter = fixtureAdapter;

现在,在您的示例中,您将有多个密钥设置为students,但students是一个对象数组,而不是id,因此创建一个名为student_ids的属性,并传递一组id,现在这是你的关键。

Posterkiosk.Classyear = Ember.Model.extend({
  students: Ember.hasMany('Posterkiosk.Student', {key: 'student_ids'})
});

如果您设置embedded: true,那么您的Classyears服务器响应应该像这样返回:

{
  classyears: [
    {..},
    {..}
  ],
  students: [
    {..},
    {..}
  ]
}

否则,EM将对Student模型上的端点单独调用,并根据student_ids属性获取该数据。

查看工作jsbin

提示:RC.7 +从partials中删除了下划线,加上部分名称应该在引号中..