ExtJs不期望从服务器得到与ExtJs 4相同的响应来确认更新行。
我有一个带有字符串id的表:
Ext.define('App.Product', {
extend: 'Ext.data.Model',
fields: [
{name: 'productid', type: 'string'},
{name: 'ord', , type: 'int'},
(...)
],
idProperty: 'nrproduit'
})
保存更改后,ExtJs客户机将修改后的数据发送到服务器:
[{"ord":1,"productid":"SG30301"},{"ord":3,"productid":"SG30100"}]
在ExtJs 4.2中,它期望服务器发回两个产品的完整数据,如下所示:
{
"success":true,
"data":[{
"nrproduit":"SG30100",
"ord":3,
"author":"...",
"editor":"...",
(...)
},{
"nrproduit":"SG30301",
"ord":3,
"author":"...",
"editor":"...",
(...)
}]
}
在ExtJs 6.2中,这不再起作用。
未捕获的错误:对于具有旧密钥“SG30301”的项目,复制新密钥“SG30100”
显然,客户端没有考虑idProperty
,但似乎期望响应中的行顺序与请求中的行顺序相同。
是否有办法强制客户端考虑从服务器发回的id?或者是否有必要更改服务器代码?是否有文档详细介绍了ExtJs 4.2和6.2之间在客户端和服务器之间的数据同步方面的具体变化?
3条答案
按热度按时间knpiaxh11#
ExtJS会考虑顺序,因为id可能会改变,例如在插入操作期间(如果id是在服务器端生成的)。为了允许这种情况,在一般情况下,ExtJS希望从服务器接收结果的顺序与发送记录的顺序相同。
但是,它还有更多的功能。在某些情况下,它使用id,而不是顺序。你可以读取
Operation.doProcess
来了解ExtJS是如何完成它所做的事情的,如果你需要不同的行为,可能会覆盖它。编辑:当模型具有
clientIdProperty
属性时,它使用id,否则使用order。因此,这样添加就足够了:q5lcpyga2#
如果您不想更改服务器端代码来处理clientIdProperty属性,另一种替代解决方案是禁用批处理模式(使用
batchActions: false
),然后逐个处理所有请求。这是防止错误 “extjs Ext.util.Collection.updateKey():为具有oldKey” 的项目复制newKey。使用他的方法,您将失去一些效率。
您必须将以下内容添加到模型中:
klr1opcd3#
只需在模型定义上添加clientIdProperty即可解决此问题。
一些更多的信息。同样的问题已经问了 Sencha 论坛,但解决方案没有提到那里。这里是链接到该讨论-
https://www.sencha.com/forum/showthread.php?301898-Duplicate-newKey-quot-x-quot-for-item-with-oldKey-quot-xx-quot