ExtJs 6 - ajax 更新请求的变化
ExtJs 6 - change in ajax update requests
与 ExtJs 4 相比,ExtJs 不期望来自服务器的相同响应来确认更新行。
我有一个 table 字符串 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 中,这不再有效。我收到错误
Uncaught Error: Duplicate newKey "SG30100" for item with oldKey "SG30301"
显然,客户端没有考虑 idProperty
,但似乎希望响应中的行顺序与请求中的顺序相同。
有没有办法强制客户端考虑从服务器发回的 ID?或者是否需要更改服务器代码?是否有关于 ExtJs 4.2 和 6.2 在客户端和服务器之间的数据同步方面究竟发生了什么变化的文档,其中包含这些细节?
ExtJS 会考虑顺序,因为 id 可以改变,例如在插入操作期间(如果 id 是在服务器端生成的)。为此,在一般情况下,ExtJS 期望以与发送记录相同的顺序从服务器接收结果。
然而,还有更多。在某些情况下,它使用 id,而不是顺序。您可以阅读 Operation.doProcess
来了解 ExtJS 是如何做的,如果您需要不同的行为,也可以覆盖它。
编辑:当模型有 属性 clientIdProperty
时使用 id,否则使用顺序。所以,这样添加就足够了:
Ext.define('App.Product', {
extend: 'Ext.data.Model',
fields: [
{name: 'productid', type: 'string'},
{name: 'ord', , type: 'int'},
(...)
],
idProperty: 'nrproduit',
clientIdProperty: 'nrproduit'
})
只需在模型定义上添加 clientIdProperty 即可解决问题。
更多信息。 sencha 论坛上有人问过同样的问题,但那里没有提到解决方案。这是该讨论的 link -
另一个替代解决方案,如果您不想更改服务器端代码来处理 clientIdProperty 属性 是禁用批处理模式(使用 batchActions: false
)和所有您的请求会一一处理。
这是为了防止错误 "extjs Ext.util.Collection.updateKey(): Duplicate newKey for item with oldKey"。用他的方法,你会失去一些效率。
您必须将此添加到您的模型中:
...
proxy: {
type: 'direct',
extraParams: {
defaultTable: '...',
defaultSortColumn: '...',
defaultSordDirection: 'ASC'
},
batchActions: false, // avoid clientIdProperty
api: {
read: 'Server.Util.read',
create: 'Server.Util.create',
update: 'Server.Util.update',
destroy: 'Server.Util.destroy'
},
reader: {
与 ExtJs 4 相比,ExtJs 不期望来自服务器的相同响应来确认更新行。
我有一个 table 字符串 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 中,这不再有效。我收到错误
Uncaught Error: Duplicate newKey "SG30100" for item with oldKey "SG30301"
显然,客户端没有考虑 idProperty
,但似乎希望响应中的行顺序与请求中的顺序相同。
有没有办法强制客户端考虑从服务器发回的 ID?或者是否需要更改服务器代码?是否有关于 ExtJs 4.2 和 6.2 在客户端和服务器之间的数据同步方面究竟发生了什么变化的文档,其中包含这些细节?
ExtJS 会考虑顺序,因为 id 可以改变,例如在插入操作期间(如果 id 是在服务器端生成的)。为此,在一般情况下,ExtJS 期望以与发送记录相同的顺序从服务器接收结果。
然而,还有更多。在某些情况下,它使用 id,而不是顺序。您可以阅读 Operation.doProcess
来了解 ExtJS 是如何做的,如果您需要不同的行为,也可以覆盖它。
编辑:当模型有 属性 clientIdProperty
时使用 id,否则使用顺序。所以,这样添加就足够了:
Ext.define('App.Product', {
extend: 'Ext.data.Model',
fields: [
{name: 'productid', type: 'string'},
{name: 'ord', , type: 'int'},
(...)
],
idProperty: 'nrproduit',
clientIdProperty: 'nrproduit'
})
只需在模型定义上添加 clientIdProperty 即可解决问题。
更多信息。 sencha 论坛上有人问过同样的问题,但那里没有提到解决方案。这是该讨论的 link -
另一个替代解决方案,如果您不想更改服务器端代码来处理 clientIdProperty 属性 是禁用批处理模式(使用 batchActions: false
)和所有您的请求会一一处理。
这是为了防止错误 "extjs Ext.util.Collection.updateKey(): Duplicate newKey for item with oldKey"。用他的方法,你会失去一些效率。
您必须将此添加到您的模型中:
...
proxy: {
type: 'direct',
extraParams: {
defaultTable: '...',
defaultSortColumn: '...',
defaultSordDirection: 'ASC'
},
batchActions: false, // avoid clientIdProperty
api: {
read: 'Server.Util.read',
create: 'Server.Util.create',
update: 'Server.Util.update',
destroy: 'Server.Util.destroy'
},
reader: {