如何在ExtJS中禁用存储的自动同步

如何在ExtJS中禁用存储的自动同步,extjs,extjs4,Extjs,Extjs4,ExtJS版本是ext-4.0.7-gpl 同步存储时,服务器以JSON格式返回相同的对象,但使用生成的ID填充,我需要将其放入存储数据中。标识符位于封闭的实体中,如下所示: { "id": 46, "name": "Excel", "typeExt": [{ "ext": "xls", "id": "137", "isMain": "false", }, { "ext": "xslx",

ExtJS版本是
ext-4.0.7-gpl

同步存储时,服务器以JSON格式返回相同的对象,但使用生成的ID填充,我需要将其放入存储数据中。标识符位于封闭的实体中,如下所示:

{
    "id": 46,
    "name": "Excel",
    "typeExt": [{
        "ext": "xls",
        "id": "137",
        "isMain": "false",
    }, {
        "ext": "xslx",
        "id": "136",
        "isMain": "false",
    }]
}
因此,id
137
136
是在服务器端生成的

我试图在商店的代理中实现它(编辑:Ajax类型)(这本身可能是错误的):

请参阅注释的变体

如果我不将
autoSync
设置为
false
,它将无限循环

如果我没有清除那些
只读
字段
修改的
脏的
,修改后的记录将包含在下一个同步请求中,如果我编辑了另一条记录,它将发送一组记录,中断我的服务器端服务

如果我清除了
dirty
modified
,如注释行所示,则更新操作只工作一次。我在RowEditing插件对话框中按下更新按钮,但它不会第二次向服务器发送所需的请求

在后一种情况下,我想我手工编辑只读字段时弄坏了一些东西,但我找不到什么

人们通常如何处理这些问题

附言


我们也尝试了,但没有成功。

我在Ext 4.0.7的网格存储中使用了此功能,但在树存储中也有类似的问题。所有这些都是通过直接代理实现的(并且自动同步为true)

如果查看Ext.data.Store::onCreateRecords的代码,您将看到存储记录被服务器返回的记录替换,因为顺序相同

因此,这非常简单:只需从服务器返回发送给create方法的相同json/对象,但是设置了id,它应该在存储中自动更新它们

我知道这没有多大帮助,但也许会给你一些指导

我认为如果你提到:

  • 您正在使用的代理类型
  • 确切的ext版本
  • 可能是启动记录创建的代码

虽然这对Ext4.0.7没有多大好处,但在Ext4.1.0中添加了和方法。希望这对其他人有用。

谢谢!代码相当混乱。它是一个
选择器
,它打开一个网格来编辑
typeExt
子数组。有两种方法,
valueToRaw
rawToValue
可以从
typeExt
数组中生成字符串,数组由
ext
字段串联而成。实际上,使用
Picker
它可以工作,但是他们希望我允许手工编辑连接的字符串,并从中生成一个通用的
typeExt
数组。我调试了该代码,以确保
pickerfield
相应地更新。。。如果我找到了如何暂时禁用自动同步的方法,而问题仍然存在,我将仔细研究该代码,可能在同步此系统失败后。再次感谢,尽管您的答案并不完全针对我的问题,但您帮助我解决了我的问题。我想接受你的回答,但我想这不是网站的规则。你可以修改你的答案,用“没有好办法禁用自动同步”,我会接受的,好吗?
proxy.afterRequest = function(request) {
     if (request.action === 'create' && request.records.length == 1) {
         me.store.autoSync = false;
         var created = Ext.JSON.decode(request.operation.response.responseText);
         request.records[0].set('id', created.id);
         request.records[0].set('typeExt', created.typeExt);
         //request.records[0].modified = {};
         //request.records[0].dirty = false;
         me.store.autoSync = true;
     }
     if (request.action === 'update' && request.records.length == 1) {
         var updated = Ext.JSON.decode(request.operation.response.responseText);
         me.store.autoSync = false;
         request.records[0].set('typeExt', updated.typeExt);
         me.store.autoSync = true;
     }

 };
request.records[0].commit(true); || request.records[0].editing = false; 

|| request.records[0].beginEdit();