【发布时间】:2017-12-01 22:14:27
【问题描述】:
试图围绕如何有效地为登录用户建模和编码“保存的项目”列表。
我希望用户能够从产品页面单击“保存项目”,它将将该项目添加到保存在其用户个人资料中的列表中,该列表有自己的路线来显示他们的项目并允许他们管理列表。在该路线上,只要列表发生更改(例如,删除项目),它应该刷新以反映更改。
我认为用户模型看起来像这样:
import DS from 'ember-data';
const { attr, belongsTo, hasMany } = DS;
export default DS.Model.extend({
savedItems: hasMany('product'),
...
});
然后我可以通过此操作向其中添加项目:
actions: {
addSavedItem(product) {
this.get('store').findRecord('user', 'me').then(user => {
user.get('savedItems').pushObject(product);
user.save();
});
},
}
并在我的已保存项目路径中加载那些已保存的项目,例如:
model() {
return this.get("store").findRecord('user', 'me').then(user => {
return user.get('savedItems');
});
}
这行得通!但是...product 传入整个产品对象。名称、价格、描述等。然后save 将其全部在有效负载中发送到后端。然后后端必须将其全部发回(我认为)才能继续工作。
有没有办法让savedItems 存储仅产品 ID,并让 ember-data 根据需要加载其余产品数据?我只需要将产品 ID 保留到后端。
我已尝试删除关系并将 savedItems 设为数组:
savedItems: attr('')
只存储产品 ID。我在那里取得了部分成功。但我不知道如何在saved-items 路由中设置model 挂钩,以便在该列表发生更改时刷新。
任何帮助表示赞赏!
更新:仅从后端传回产品 ID 有效 - 但前提是产品已经在商店中。
【问题讨论】:
-
您是否尝试过使用
user.get('savedItems').id()或.ids()?也许你应该使用hasMany('product').id()?我记得在某处看到过稀薄的东西,但我不记得了:(
标签: ember.js ember-data