好的,必填信息:
DEBUG: -------------------------------
DEBUG: Ember : 1.3.1
DEBUG: Ember Data : 1.0.0-beta.7.f87cba88
DEBUG: Handlebars : 1.0.0
DEBUG: jQuery : 1.10.2
DEBUG: -------------------------------
以下是相关型号:
App.Destination = DS.Model.extend({
label: DS.attr('string'),
destinationMatchRules: DS.hasMany('destinationMatchRule', { async: true }),
chargeRules: DS.hasMany('chargeRule', { async: true }),
});
App.ChargeRule = DS.Model.extend({
startDate: DS.attr('date'),
endDate: DS.attr('date'),
costPerMinute: DS.attr('number'),
countryCode: DS.attr('string'),
label: DS.attr('string'),
connectionCost: DS.attr('number'),
destination: DS.belongsTo('destination', { async: true }),
});
App.DestinationMatchRule = DS.Model.extend({
pattern: DS.attr('string'),
priority: DS.attr('number'),
destination: DS.belongsTo('destination', { async: true }),
});
我有一个destination.edit
路线/控制器/模板,让我可以一起创建或编辑这些内容。如果我从头开始创建一个新集并将它们全部连接起来,我将使用以下代码来保存所有内容:
save: function() {
var destination = this.get('content');
destination.save().then(function(){
var promises = Ember.A();
destination.get('destinationMatchRules').forEach(function(item){
promises.push(item.save());
});
destination.get('chargeRules').forEach(function(item){
promises.push(item.save());
});
Ember.RSVP.Promise.all(promises).then(function(resolvedPs){
alert('All saved!');
});
});
}
它有效!有很多的欣喜。
然而。如果我使用相同的路线和代码edit现有的图表 - 假设我编辑目的地的标签和/或目的地匹配规则的优先级 - 我对两者都有很大的问题belongsTo('destination', { async: true })
关系。
我已经在序列化器中放置了断点serializeBelongsTo
方法和我的一切save
方法。似乎正在发生以下情况:
- 如果
DestinationMatchRule
and ChargeRule
中的对象hasMany
不是新创建的记录,调用.save()
on the Destination
记录自动尝试将记录保存在hasMany
s,因此显式子记录item.save()
呼叫我的save
在这种情况下,上述方法会被抢占。 (我认为……这是我不太确定的部分)
- 当。。。的时候
serializeBelongsTo
调用序列化器的方法DestinationMatchRule
and ChargeRule
记录、destination
每个属性都是一个DS.PromiseObject
, and承诺是未解决的。这导致serializeBelongsTo
adding destination: undefined
到 JSON 对象,最终在destination
财产是dropped完全来自发送到后端的序列化 JSON。
当然,这会导致我的后端认为destination
子记录的对象已被删除(在我的例子中这会导致基数违规)。
当我将日志语句放在我的明确的附近时item.save()
打电话,我看到的是DS.PromiseObject
is解决了,这就是为什么我得出上面#1 中描述的结论。我首先尝试以各种方式包装这些电话Ember.run.next
回调尝试给出belongsTo
是时候解决了,但如果我对第一点的看法是正确的,那无论如何也没有帮助。但这也意味着我没有地方尝试解决这个问题!
有人可以帮我解决这个问题吗?我已经很接近了,我认为这可能是让 Ember 数据真正发挥作用并用于“雄心勃勃”的 Web 应用程序的最后一场战斗。
Edit
更正一下,我对此处操作顺序的结论是不正确的。事实上我can使其适用于新创建的图表和编辑现有的图表save
方法如下所示:
save: function() {
var destination = this.get('content');
destination.save().then(function(){
//var promises = Ember.A();
destination.get('destinationMatchRules').forEach(function(item){
item.get('destination').then(function(){
item.save();
});
//promises.push(item.save());
});
destination.get('chargeRules').forEach(function(item){
item.get('destination').then(function(){
item.save();
});
});
//Ember.RSVP.Promise.all(promises).then(function(resolvedPs){
// alert('All saved!');
//});
});
}
但是,这不能很好地扩展:如果我有更多怎么办?belongsTo
关系?他们可能都得和解吗?而且现在更难判断整个操作何时完成——我无法添加item.save()
将承诺返回给我的承诺数组,因为它不是立即创建的(评论中对此欢迎的提示)。而且,我应该then
一些我没有看到的其他承诺,以确保destination.save()
是真的really完成,并且所有关系都已传播?