【发布时间】:2014-03-25 20:31:58
【问题描述】:
就像我对 ember-data 所做的大多数事情一样,简单的测试用例非常简单,但由于我缺乏理解(我认为是文档),任何“真实”的东西都会很快分崩离析。在最简单的情况下,我可以毫无问题地创建新记录并将其保存到我的 REST API。我将使用流行的水果篮示例,并从保存一个新的fruit 开始。
// Here is our fruit model
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
});
// This is easy to create and save
var fruit = this.store.createRecord('fruit', {
name: 'apple',
color: 'red'
});
fruit.save().then(successCallback, errorCallback);
好的,我这里没问题。从概念上讲是有道理的,代码很干净,而且看起来很漂亮!现在假设我们有一个basket 模型并且basket 模型可以容纳很多fruit。此外,用户可以从 UI 一步创建新的fruit 并将其添加到尚未创建的新basket。
以下是新模型:
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
basket: DS.belongsTo('basket')
});
module.exports = App.Basket = DS.Model.extend({
fruits: DS.hasMany('fruit', {async:true})
});
鉴于上述情况,假设用户在商店或后端 REST API 中当前不存在的两种新水果中输入,将它们添加到他的新购物篮(也尚不存在),然后点击'保存'。
您如何使用 Ember Data 创建此记录?我希望你能做这样的事情:
var newFruits = Ember.A();
newFruits.pushObject(this.store.createRecord('fruit', {
name: 'orange',
color: 'orange'
}));
newFruits.pushObject(this.store.createRecord('fruit', {
name: 'banana',
color: 'yellow'
}));
var basket = this.store.createRecord('basket', {
fruits: newFruits
});
basket.save().then(successCallback, errorCallback);
不幸的是,这似乎不起作用。当我在 Chrome 检查器中查看 POST 请求数据时,篮子的 fruits 属性始终为空。基本上,请求最终看起来是这样的:
{
basket: {
fruits: []
}
}
我是否使用正确的模式来创建“篮子”记录?我希望我不必在保存篮子之前先保存每块水果,因为当 1 个就足够时发送 3 个 POST 请求似乎很浪费。此外,当用户想要创建 10 个水果时会发生什么?那将是 11 个 POST 请求。
是否有完成上述操作的标准做法?本质上,您如何创建具有 hasMany 关系(篮子)的新记录,其中 hasMany 关系中的记录也是新的(水果)。
谢谢!
这是我正在使用的版本:
-------------------------------
Ember : 1.3.2+pre.25108e91
Ember Data : 1.0.0-beta.7+canary.238bb5ce
Handlebars : 1.3.0
jQuery : 2.0.3
-------------------------------
【问题讨论】:
标签: ember.js ember-data