Как добавить объекты в отношения hasMany с данными ember

У меня есть эти две модели:

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 data запускает запрос PUT на сервер, и моя модель обновляется. Итак, очевидно, проблема заключается в том, когда я обновляю отношения. Я делаю это неправильно или это ошибка данных Ember?


person George Eracleous    schedule 22.12.2012    source источник


Ответы (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 для более подробной информации.

В частности, WIP по отношениям с inverse:null и manyToMany.

person Bradley Priest    schedule 23.12.2012
comment
У предмета может быть много корзин, т. е. его можно выбрать более чем в корзине. Это означает, что мне нужно отношение многие ко многим. У меня сложилось впечатление, что отношения ManyToMany еще не поддерживаются. - person George Eracleous; 23.12.2012
comment
Именно, inverse:null и manytomany все еще находятся в разработке. Надеюсь, в вашем приложении у одного пользователя есть одна корзина, поэтому вы можете рассматривать ее как отношение «один ко многим» на клиенте? - person Bradley Priest; 23.12.2012
comment
У одного пользователя может быть несколько корзин, но я думаю, что пока могу смоделировать это таким образом. Поэтому мой код не работает? Из-за отсутствия обратной зависимости? Кроме того, какой из упомянутых выше методов является правильным способом добавления нового объекта в отношение hasMany? - person George Eracleous; 23.12.2012
comment
Обновлен ответ, да, отсутствующий обратный вызывает ошибку. pushObject — лучший способ добавить существующий объект в ManyArray. - person Bradley Priest; 23.12.2012
comment
Здорово. Это устранило предыдущую проблему. Большое спасибо. Единственная проблема сейчас заключается в том, что запускается только запрос PUT к конечной точке Items. Он обновляет только одну сторону отношений. Корзина никогда не обновляется, когда я фиксирую. - person George Eracleous; 23.12.2012
comment
Каков ожидаемый ответ для отношения hasMany-belongsTo, я думаю, это было не так просто, как просто притвориться, что manytomany не существует. Лично я бы просто одновременно добавил отношение hasMany в противоположном направлении, но это было бы очень опасным путем. - person Bradley Priest; 24.12.2012
comment
Большое спасибо за это. - person TommyT; 01.09.2016