【问题标题】:ember-data: modeling a user-maintained list of productsember-data:建模用户维护的产品列表
【发布时间】: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


【解决方案1】:

我自己就是这样建立这样的关系的:

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

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

【讨论】:

  • 啊……这很好。还回答了我关于如何添加特定于 savedItem 的字段而不必将它们添加到产品(它们不属于的地方)的问题。感谢您花时间回答!
  • 不客气!如果它回答了您的问题,请随时接受此答案。
  • 在商店中只有产品 ID 的情况下,有任何关于如何解决saveditem 模型的product 关系的指导吗? IE。在用户查看他们保存的项目的“saveeditems”路径中,项目在那里,但他们的所有数据都是空的,因为 ember 没有获取产品数据。这会是侧载的用武之地吗?
  • 请单独提出这个问题。它应该自动重新加载子模型。取决于您的模型定义以及您如何请求它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多