在 Ext JS 4 中通过 store.sync() 更新记录后,记录翻倍

Posted

技术标签:

【中文标题】在 Ext JS 4 中通过 store.sync() 更新记录后,记录翻倍【英文标题】:After updating a record via store.sync() in Ext JS 4, the record is doubled 【发布时间】:2011-12-15 16:52:07 【问题描述】:

我的 json-store 包含一条记录。此记录在更改字段后是脏的,并且在 store.sync() 之后正确发送了一个带有 action=update 的 POST 和正文中的记录数据。

在服务器端,我提交更新并将记录发回(成功:true),因为它最初发布(包括所有字段)。

之后商店将记录翻倍,这意味着商店现在有两 (2) 条相同的记录(相同的 id 等)。

我尝试了所有我能想到的选项(root [on/off]、idProperty(set/unset)等),效果总是一样的。

任何提示我做错了什么?

【问题讨论】:

【参考方案1】:

我看到了同样的问题,我的理论是返回记录上的 id 匹配没有正确发生。我的意思是在我看来 idProperty 类型必须是 int 例如,而不是字符串或类似的灾难。我无法以一种或另一种方式证明这一点,但我确实有一种解决方法。以下是我“处理”这个问题的方式:

1)。不发回数据,只发送成功消息。 2)。使用以下存储侦听器手动清除脏标志:

listeners : 
            write: function(store, operation, opts)
                console.log('request wrote!');
                //workaround to sync up store records with just completed operation
                Ext.each(operation.records, function(record)
                    if (record.dirty) 
                        record.commit();
                    
                    /*if (record.phantom) 
                        record.phantom=false;
                    */
                );
                store.load();
            ,
            delay: 2000
        

编辑:我不久前在高级论坛上问过这个问题,我得到的答案是它应该可以工作,这是一个应该证明它的例子。 http://pastebin.com/z3gekQDn请注意模型中的id映射。

【讨论】:

这可行,但与描述的不同......当我只发回“success:true”时。一切正常,我不必清除脏标志。它是自动完成的。这是错误还是功能? ExtJS 有很多实际上只是“功能”的错误... =/ 请参阅我的答案中的编辑以获取一个假定有效的示例。【参考方案2】:

确保您的服务器返回一个记录数组。如果您只有一条记录,请将其放入数组中并发送回。

用 Firebug 查看这个demo。

【讨论】:

这绝对行不通。如果我同时更新两条记录并将它们作为数组发回,则两者都在商店中重复。发送数组中的记录不会改变任何内容。 --> 另见我对其他答案的评论。【参考方案3】:

我终于找到了所描述的不当行为的原因。在我的模型中,我已经像这样覆盖了构造函数:

constructor: function(config) 
    this.callParent([config]);
,

我真的不记得我为什么这样做了,但是因为我已经删除了构造函数,所以一切正常。但由于我相对缺乏经验,我不知道为什么会这样。

【讨论】:

以上是关于在 Ext JS 4 中通过 store.sync() 更新记录后,记录翻倍的主要内容,如果未能解决你的问题,请参考以下文章

extjs中通过ComboBox 的选择控制fieldLabel的隐藏和显示怎么做

SQLAlchemy学习-4.一对一关系

ExtJS 6在store sync的回调中访问messageProperty

如何在SQLAlchemy模型的构造函数中通过关系存储数据?

如何在节点js中通过url读取文件

在 Rails 中通过 JS 设计注册#update