序列化修改记录时,belongsTo 承诺未解决

2023-12-31

好的,必填信息:

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方法。似乎正在发生以下情况:

  1. 如果DestinationMatchRule and ChargeRule中的对象hasMany不是新创建的记录,调用.save() on the Destination记录自动尝试将记录保存在hasManys,因此显式子记录item.save()呼叫我的save在这种情况下,上述方法会被抢占。 (我认为……这是我不太确定的部分)
  2. 当。。。的时候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完成,并且所有关系都已传播?


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

尽管如此,这就是我正在做的解决这个问题的方法,我创建了一种新方法DS.Model called 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首先自动保存所有子关系的方法,但我将把它作为练习留给读者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化修改记录时,belongsTo 承诺未解决 的相关文章

随机推荐

  • 如何删除旧的订阅

    我有 3 年的订阅 我只想删除 2 年未使用的旧订阅和孤儿订阅 下面的脚本显示了所有订阅 计划 创建时间 上次执行时间 对于缺乏归属表示歉意 您可以使用它来查找要转储的订阅位置 并使用 Kavins 指示手动删除它们 SSRS SUbscr
  • 如何使用 sympy 定义条件函数?

    我希望能够定义一个表达式 该表达式获取定义变量的所有值并将表达式计算为0当它没有定义时 与此类似 import numpy as np import sympy as sp def expr k1 k2 x y sp symbols x y
  • VB.NET - 计算两个日期之间的天数(排除)

    我正在尝试计算两个日期之间的天数 不包括星期六 and Sundays 到目前为止我已经写了这段代码 Dim startDay As Integer Dim endDay As Integer Dim days As Integer Dim
  • Elastic Search 匹配短语查询 -> 输出不可预测

    示例文档 id 5 title Quick Brown fox jumps over the lazy dog genre fiction Mapping movies mappings properties genre type text
  • Jupyter Notebook 和之前的输出

    有什么方法可以在不重新运行程序的情况下查看以前的输出吗 例如 我让机器学习算法过夜 早上我就得到了结果 但是 由于某种原因 当我在原始代码上按 Enter 时 它再次开始运行 原始输出消失了 输出存在于特定的上下文中 即单元 并且只要内核仍
  • 什么事件捕获 DataGridViewCell 中组合框中的值更改?

    我想在 a 中的值发生更改时处理该事件ComboBox in a DataGridView cell 有的是CellValueChanged事件 但直到我单击事件内的其他位置后 该事件才会触发DataGridView 一个简单的ComboB
  • ggplot:同时通过“geom_rect”排列因子顺序并突出显示区域

    首先 指定分类变量顺序的方法ggplot是重新排序它的级别data frame 其次 要在我们可以使用的任何绘图上突出显示一个区域geom rect 这里需要注意的是 不要将数据传递给geom rect 否则它不允许我们设置alpha 因此
  • 在 Haskell 中操作元组

    我是 Haskell 的新手 我有一个关于元组的问题 难道就没有遍历元组的方法吗 我知道使用列表进行遍历非常容易 但是如果输入作为元组给出 是否没有办法像使用列表一样检查整个元组 如果不是这种情况 是否可以将元组中的值提取到列表中并以这种方
  • 全屏纹理 iPhone OpenGL ES

    我知道 iPhone 上的 OpenGL 纹理需要是 2 的幂 OpenGL 2 0 也是如此吗 如果我有一个尺寸为 320 x 480 的图像并且想要将其全屏绘制 是否有任何可能的方法可以使用 OpenGL 来完成此操作 Thanks N
  • 如何使用 async/await 在 Node.js 中异步创建ReadStream

    我在使用时遇到困难fs creadReadStream异步处理我的 csv 文件 async function processData row perform some asynchronous function await someAsy
  • 二分查找条件中何时使用“=”?

    我对何时使用的场景感到很困惑 在二分查找中 例如 这是我从 wiki 中找到的 其中使用 while imin lt imax int binary search int A int key int imin int imax contin
  • ios 设置包中的简单标题输出

    我只想在设置文件中输出我的 ios 应用程序的版本号 我知道我必须将设置文件添加到应用程序文件夹中 当我构建并运行时 我可以看到标准设置包附带的 4 个设置 为了获得一个简单的只读字符串 我将第二个值更改为以下 在代码 didFinishL
  • 检查一个列表是否包含另一个列表中的元素

    我有两个列表 其中包含不同的对象 List
  • 如何使用具有不同对象的“repeating:count:”来初始化数组? [复制]

    这个问题在这里已经有答案了 令人惊讶的是 下面的代码打印SAME而初始化程序应该调用Z 每次构造函数 如何使用此方法与不同的实例初始化数组Z import Foundation class Z var i Int 0 var z Z Z r
  • 英特尔 XDK:将您的移动应用连接到数据库

    我目前正在开发一个应用程序 如果我没有数据库 构建后的应用程序将会很重 如何将应用程序连接到本地或远程数据库 提前致谢 您可以使用以下方法之一来使用数据库 1 使用 HTML5 客户端数据库 HTML5 在本地客户端计算机上提供四种不同类型
  • 如何在交互式会话中重置下划线? [复制]

    这个问题在这里已经有答案了 我已经覆盖了下划线变量 在Python交互式解释器中 如何在不重新启动解释器的情况下使下划线再次工作 del 一个全球性的 shadows https en wikipedia org wiki Variable
  • 如何在 PHP 中使用 SerializeArray 值?

    我从表单中获得了调整大小 resize resize form serializeArray 我把调整大小放在隐藏中并将其发送到php页面 如何在php中获取调整大小值
  • React-Bootstrap / React-Router-Bootstrap 中导航栏品牌的最佳实践

    存在关于锚标记的问题反应引导 and 反应路由器 我很好奇其他人是如何处理这种情况的 可以只留下带有 href 的锚标记 例如 a href Site Title a 并避免使用IndexLinkContainer 还有使用MenuItem
  • 将错误消息设置为英语不起作用

    由于某种原因 我无法更改 PostgreSQL 错误消息的语言 我尝试在脚本内设置语言以在第一行创建架构 SET lc messages TO en US UTF 8 我也做了this https stackoverflow com que
  • 序列化修改记录时,belongsTo 承诺未解决

    好的 必填信息 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