gpt4 book ai didi

serialization - belongsTo promise 在序列化修改后的记录时未解决

转载 作者:行者123 更新时间:2023-12-02 03:37:50 27 4
gpt4 key购买 nike

好的必填信息:

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 路由/ Controller /模板,可以让我一起创建或编辑它们。如果我从头开始创建一个新集并将它们全部连接起来,我将使用此代码来保存所有内容:

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!');
});
});
}

而且有效!人们非常高兴。

但是。如果我使用相同的路线和代码来编辑一个现有的图表——比如我编辑目的地的标签和/或 destinationMatchRule 的优先级——我在 belongsTo('destination' , { async: true }) 关系。

我在序列化器的 serializeBelongsTo 方法和整个 save 方法中都设置了断点。似乎发生了以下情况:

  1. 如果 hasMany中的 DestinationMatchRuleChargeRule对象不是新创建的记录,则调用 .save() Destination 记录上的 自动尝试将记录保存在 hasMany 中,因此显式子记录 item.save()在这种情况下,我上面的 save 方法中的调用被抢占了。 (我想……这是我不太确定的部分)
  2. 当为 DestinationMatchRuleChargeRule 记录调用序列化程序的 serializeBelongsTo 方法时,destination 属性每个都是 DS.PromiseObject并且 promise 是 Unresolved 。这导致 serializeBelongsTo 添加 destination: undefined 到 JSON 对象,并最终导致 destination 属性被完全删除来自发送到后端的序列化 JSON。

自然地,这会导致我的后端认为子记录的 destination 对象已被删除(在我的情况下会导致基数违规)。

当我将日志记录语句放在显式 item.save() 调用附近时,我看到的是 DS.PromiseObject 解决了,这就是为什么我总结我在上面 #1 中描述的内容。我首先尝试以各种方式包装这些调用 Ember.run.next 回调以尝试给 belongsTo 时间来解决,但如果我对#1 的看法是正确的无论如何都帮不上忙。但这也意味着我没有地方尝试解决这个问题!

有人能帮我解决这个问题吗——我已经很接近了,我认为这可能是让 Ember 数据实际工作并用于“雄心勃勃”的 Web 应用程序的最后一场战斗。

编辑

更正,我对这里的操作顺序的结论是不正确的。事实上,我可以通过使我的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() 返回的 promise 添加到我的 promises 数组中,因为它不是立即创建的(hints on this欢迎评论)。而且,我是否应该 then 一些我没有看到的其他 promise ,以确保 destination.save() 真的真的 完成,并且所有关系都已传播?

最佳答案

作为答案发布,因为这现在看起来是一个很好的通用解决方案。但如果这是必要的,我真的很想知道代码中是否已经有一种方法可以更简洁地处理它,我正在复制一些东西……

尽管如此,我正在做的是解决这个问题,我在 DS.Model 上创建了一个名为 saveWhenSettled 的新方法,它返回一个 Promise:

DS.Model.reopen({
saveWhenSettled: function() {
var record = this;
return new Ember.RSVP.Promise(function(resolve, reject){
var promises = Ember.A();
record.eachRelationship(function(rel){
if(record.get(rel).then) promises.pushObject(record.get(rel));
});
Ember.RSVP.Promise.all(promises).then(function(){
record.save().then(function(result){
resolve(result);
}, function(reason){
reject(reason);
});
}, function(reason){
reject(reason);
});
});
}
});

现在我可以:

save: function() {
var destination = this.get('content');
destination.save().then(function(){
var promises = Ember.A();
destination.get('destinationMatchRules').forEach(function(item){
promises.push(item.saveWhenSettled());
});
destination.get('chargeRules').forEach(function(item){
promises.push(item.saveWhenSettled());
});
Ember.RSVP.Promise.all(promises).then(function(resolvedPs){
alert('All saved!');
});
});
}

所以我收到了完成通知,它会自动处理记录中需要解决的多个关系(自发布问题以来我已经遇到过)。

再一次,我希望有人告诉我我重复了基线代码,我应该用另一种方式来做。

可能会使用类似的方法来推广我的save 方法以首先自动保存所有子关系,但我会将其留给读者作为练习。

关于serialization - belongsTo promise 在序列化修改后的记录时未解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245793/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com