【问题标题】:How to add objects to a hasMany relationship with ember data如何将对象添加到与 ember 数据的 hasMany 关系
【发布时间】:2012-12-22 17:21:35
【问题描述】:

我有这两个模型:

App.Items = DS.Model.extend({
    provider: DS.attr('string'),
    name: DS.attr('string'),
    description: DS.attr('string'),
});

App.Baskets = DS.Model.extend({
    selectedItems: DS.hasMany('App.Items'),
    name: DS.attr('string'),
    username: DS.attr('string'),
})

现在我要做的是在用户选择时将新项目添加到篮子中。我试过这样做:

basket = App.Baskets.find(1);
item = App.Items.find(1);
basket.set("selectedItems", item)  ; 
App.store.commit();

这不会返回任何错误,但不会触发对服务器的任何请求。

或者,我试过这个:

basket = App.Baskets.find(1);
selectedItems = basket.get("selectedItems")
selectedItems.pushObject(App.Items.find(1))
App.store.commit();

此方法返回错误:

Uncaught TypeError: Cannot call method 'indexOf' of undefined ember.js:1691
get ember.js:1691
DS.OneToManyChange.sync ember-data.js:4572
(anonymous function) ember-data.js:424
OrderedSet.forEach ember.js:1410
DS.ManyArray.DS.RecordArray.extend.arrayContentDidChange ember-data.js:423
newFunc ember.js:1167
Ember.ArrayProxy.Ember.Object.extend.arrangedContentArrayDidChange ember.js:10600
sendEvent ember.js:3792
Ember.Array.Ember.Mixin.create.arrayContentDidChange ember.js:7933
Ember.Mixin.create.replace ember.js:11011
Ember.ArrayProxy.Ember.Object.extend.replaceContent ember.js:10476
DS.ManyArray.DS.RecordArray.extend.replaceContent ember-data.js:351
newFunc ember.js:1167
Ember.ArrayProxy.Ember.Object.extend.replace ember.js:10591
Ember.MutableArray.Ember.Mixin.create.insertAt ember.js:8398
Ember.MutableArray.Ember.Mixin.create.pushObject ember.js:8450
App.Router.Ember.Router.extend.root.Ember.Route.extend.items.Ember.Route.extend.savePreferences dashboard-app.js:218
sendRecursively ember.js:17303
sendEvent ember.js:17320
Ember.StateManager.Ember.State.extend.send ember.js:17845
ActionHelper.registeredActions.(anonymous function).handler ember.js:22673
(anonymous function) ember.js:13009
Ember.handleErrors ember.js:379
(anonymous function) ember.js:13003
v.event.dispatch jquery.min.js:2
o.handle.u

奇怪的是,当我尝试设置同一模型的普通属性时,比如说设置篮子的名称,一切正常。 Ember 数据向服务器发出 PUT 请求,并且我的模型已更新。所以很明显,问题是当我更新关系时。我这样做是错误的方式还是 ember 数据错误?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    您的代码失败了,因为在当前版本的 Ember Data 中,您必须为每个关系指定一个逆向关系。

    App.Item = DS.Model.extend({
        provider: DS.attr('string'),
        name: DS.attr('string'),
        description: DS.attr('string'),
        basket: DS.belongsTo('App.Basket')
    });
    
    App.Basket = DS.Model.extend({
        items: DS.hasMany('App.Item'),
        name: DS.attr('string'),
        username: DS.attr('string'),
    })
    
    basket = App.Basket.find(1);
    basket.get("items").pushObject(App.Item.find(1));
    App.store.commit();
    

    查看 Github 上的问题了解更多详情。

    尤其是关于与 inverse:null 和 manyToMany 关系的 WIP。

    【讨论】:

    • 一个项目可以有多个篮子。即它可以被多个篮子选择。这意味着我需要多对多的关系。我的印象是尚未支持多对多关系。
    • 没错,inverse:null 和 manytomany 都还在计划中。希望在您的应用程序中,一个用户拥有一个购物篮,这样您就可以将其视为客户端上的一对多关系?
    • 一个用户可以有多个购物篮,但我想我现在可以这样建模。这就是我的代码失败的原因吗?由于缺少反向关系?另外,我上面提到的哪种方法是将新对象添加到 hasMany 关系的正确方法?
    • 更新了答案,是的,缺少的逆是导致错误的原因。 pushObject 是将现有对象添加到 ManyArray 的最佳方式
    • 太棒了。这解决了之前的问题。非常感谢。现在唯一的问题是只触发了对 Items 端点的 PUT 请求。它只更新关系的一侧。当我提交时,篮子永远不会更新。
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多