在 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的隐藏和显示怎么做
ExtJS 6在store sync的回调中访问messageProperty