ember-data:建模用户维护的产品列表
ember-data: modeling a user-maintained list of products
我正在思考如何有效地为登录用户建模和编码 "saved items" 列表。
我希望用户能够从产品页面单击 "save item",它会将该项目添加到保存在其用户配置文件中的列表中,该列表有自己的路线来显示他们的项目并允许他们管理列表。在那条路线上,只要列表发生变化(例如,项目被删除),它应该刷新以反映变化。
我认为用户模型看起来像这样:
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 数据加载其余的按需提供产品数据? Product ID 就是我需要持久化到后端。
我试过删除关系并让 savedItems
成为一个数组:
savedItems: attr('')
仅存储产品 ID。我在那里取得了部分成功。但我不知道如何在 saved-items
路由中设置 model
挂钩,以便在该列表发生更改时刷新。
感谢任何帮助!
更新: 只从后端传回产品 ID 是可行的 - 但前提是产品已经在商店中。
我自己就是这样建立这样的关系的:
// model user.js
export default DS.Model.extend({
savedItems: hasMany('savedItem'),
...
});
// model savedItem.js
export default DS.Model.extend({
//id- I have my ids in such a model as a string 'userID_productID'
// just for convinience in the backend.
user: belongsTo('user'),
product: belongsTo('product'),
someOtherPropertyUniqueToThatRelation: attr('string'), // like a status
...
});
然后我只需将另一条记录添加到 relationShip 模型。
addSavedItem(product) {
this.get('store').findRecord('user', 'me').then(user => {
let safedItem = this.get('store').createRecord('safedItem', {
user: user,
product: product,
otherProp: 'whatever'
});
safedItem.save();
});
},
现在只向后台发送用户id和产品id。
也许我做错了,或者这是一种奇怪的方法,但这对我来说在所有情况下都适用。
我正在思考如何有效地为登录用户建模和编码 "saved items" 列表。
我希望用户能够从产品页面单击 "save item",它会将该项目添加到保存在其用户配置文件中的列表中,该列表有自己的路线来显示他们的项目并允许他们管理列表。在那条路线上,只要列表发生变化(例如,项目被删除),它应该刷新以反映变化。
我认为用户模型看起来像这样:
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 数据加载其余的按需提供产品数据? Product ID 就是我需要持久化到后端。
我试过删除关系并让 savedItems
成为一个数组:
savedItems: attr('')
仅存储产品 ID。我在那里取得了部分成功。但我不知道如何在 saved-items
路由中设置 model
挂钩,以便在该列表发生更改时刷新。
感谢任何帮助!
更新: 只从后端传回产品 ID 是可行的 - 但前提是产品已经在商店中。
我自己就是这样建立这样的关系的:
// model user.js
export default DS.Model.extend({
savedItems: hasMany('savedItem'),
...
});
// model savedItem.js
export default DS.Model.extend({
//id- I have my ids in such a model as a string 'userID_productID'
// just for convinience in the backend.
user: belongsTo('user'),
product: belongsTo('product'),
someOtherPropertyUniqueToThatRelation: attr('string'), // like a status
...
});
然后我只需将另一条记录添加到 relationShip 模型。
addSavedItem(product) {
this.get('store').findRecord('user', 'me').then(user => {
let safedItem = this.get('store').createRecord('safedItem', {
user: user,
product: product,
otherProp: 'whatever'
});
safedItem.save();
});
},
现在只向后台发送用户id和产品id。
也许我做错了,或者这是一种奇怪的方法,但这对我来说在所有情况下都适用。