Ember-DATA:建模用户维护的产品列表



试图围绕如何有效地对登录用户建模和编码"已保存的项目"列表。

我希望用户能够从产品页面中单击"保存项目",它将将项目添加到其用户配置文件中的列表中,该列表具有自己的路由,该路由显示自己的项目,并允许他们管理列表。在该路线上,任何时候都会更改列表(例如,删除项目),它应该刷新以反映更改。

think 用户模型看起来像这样:

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 Store Just 产品IDS,并且Ember-Data加载其余产品数据所需的其余产品?我需要持续到后端的产品ID。

我尝试删除关系并让savedItems成为一个数组:

savedItems: attr('')

仅存储产品ID。我在那里取得了部分成功。但是我不知道如何在saved-items路由中设置model钩子,因此每当该列表发生更改时,IT刷新。

任何帮助!

更新:仅从后端传递产品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
    ...
});

然后,我只是将另一个记录添加到关系模型中。

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发送到后端。

也许我做错了,或者这是一种奇怪的方法,但是在所有情况下对我来说都很好。

最新更新