在emberjs中动态填充具有更详细数据的模型

pol*_*ick 7 ember.js ember-data

我在emberjs中实现master-detail视图时有点困惑.

我的大多数观点都有一个主视图,它只是一个标题列表.然后,用户可以点击这样的标题,并且他/她获得具有细节视图的叠加(有点像典型的新站点页面).

现在,我注意到当ember询问主视图的信息时,它会调用以下网址:/backend/newsitems.但是这些调用会变得非常繁重,因为后端会返回所有newsitems的列表及其所有详细数据.但这感觉不对,因为用户只是在查看主视图并且还没有请求任何详细信息.

有没有办法让ember明确主视图只需要几个属性,并且对详细信息的请求应该获得该特定项的额外属性?

举个例子,我的模型看起来像这样:

App.Newsitem = DS.Model.extend({
  slug: DS.attr('string'),
  type: DS.attr('string'),
  title: DS.attr('string'),
  summary: DS.attr('string'),
  text: DS.attr('string'),
  thumb: DS.attr('string'),
  date: DS.attr('date'),

  mediaitems: DS.hasMany('App.Mediaitem')
});
Run Code Online (Sandbox Code Playgroud)

但是我的主视图只需要id type title显示标题列表和该标题旁边的图标.然后,当用户请求一个newsitem的详细信息时,应该获取所有其他属性.

Mik*_*tti 2

有没有办法让 ember 清楚地知道主视图只需要几个属性,并且对详细信息的请求应该获取该特定项目的额外属性?

当然可以,但也许不是以您期望的方式。Ember 模型确实是轻量级的,因此它们和后端模式之间不需要有 1-1 的关系。总的来说,我喜欢在 API 端点方面考虑 ember-models。在这种情况下,您的 API 公开了 2 个不同的数据集,因此最直接的解决方案是创建一个单独的 ember 模型来表示轻量级的标题列表。该模型将在 处拥有自己的 api 端点/backend/newsitem_listings

App.NewsitemListing = DS.Model.extend({
  slug: DS.attr('string'),
  type: DS.attr('string'),
  title: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您可以使用App.NewsitemListing.find()App.NewsitemListing.find({query: q})来获取部分/全部列表,然后App.Newsitem.find(id)加载单个记录的详细信息。您可能会考虑添加关系,例如newsitem: DS.hasOne('App.Newsitem')模型,或者您可以仅使用 slug 动态生成链接。