ExtJS 网格行编辑器在网格保存和存储重新加载后仍然很脏
ExtJS Grid roweditor still dirty after grid save and store reload
我正在使用 ExtJS 5.1.3,我有一个从具有模型的商店加载的网格。网格设置为使用插件 roweditor,所以我编辑一个单元格并给它一个新值,此时红色勾号显示单元格已被更改。
我有一个保存按钮,单击该按钮时会得到 store.getModifiedRecords() 并将其传递给 ajax 请求,此请求成功后会发生一些事情,我执行的最后一个操作是再次加载网格存储,然后用最新版本的数据再次填充网格,这很好并且似乎按预期工作。
因为这是一个多页面应用程序,所以当用户离开此页面时我也会进行检查,这是为了捕获任何未保存的网格更改,所以基本上我从页面获取任何表单并验证 isDirty()值,这是我发现问题的地方,roweditor 被 return 编辑为脏,这是因为某些列有一个编辑器并且 ExtJS 在这些字段上使用表单验证,
我不明白为什么商店再次加载没有清除与网格列关联的任何脏字段?我尝试了很多事情,例如在 ajax 请求之前清除商店以及刷新网格视图,我尝试在执行 ajax 请求之前提交商店更改,但每次我尝试在网格保存后离开页面我选择行编辑器因为它有脏字段:(非常感谢任何帮助。
编辑:设法在一个简单的 fiddle
上复制
https://fiddle.sencha.com/#view/editor&fiddle/1rmf
fiddle是最基本的,按照以下步骤复制;
- 编辑第一行年龄,将年龄更改为 13
- 单击“保存”(我正在强制商店加载我们所做更改的数据)
- 单击 'Check roweditor is Dirty() value' 按钮查看 roweditor isDirty() 函数的值,这将 return true
如果您查看按钮处理程序,您可以深入查看表单[0].items.items[2] 并查看该字段有 dirty: true 这就是为什么 isDirty() 是 return 是真的。
解决方案
如接受的答案中所述,行编辑器不受商店 edit/cancel 或我的负载的影响。单击 'Save' 时我所做的是获取网格,然后是编辑器及其表单并在此调用 reset() 以便再次有效地同步所有内容。
grid.editingPlugin.getEditor().form.reset();
您还可以通过 grid.getPlugins() 访问插件,其中 return 是一个数组
已更新 fiddle 以显示其正常工作
我将尝试回答有关我使用全 ExtJS 桌面应用程序的经验。
顺便说一句,快速浏览一下您的描述,您可能需要调用 Store.sync() 方法来刷新您的商店。
再深入一点,使用ExtJs做CRUD的方法有很多
我是使用 store 的 "instance" 创建的,但在某些时候我不得不将其更改为静态调用,如 MyApp.store.Model.save() 等。这使得你只有一个实例存储避免脏数据。
如果你需要,这是我的项目文件夹
https://github.com/guilhermeribeirodev/grizzlyboilerplate/tree/master/src/main/webapp/js/MyApp
在编辑过程中,grid
最终会在 editor
的 form
上调用 loadRecord
。但是在编辑成功或取消时,编辑器的表单不会被清除。这就是为什么您的脏度检查 returns 为假。
重新加载数据的网格不会破坏编辑器。这是一个优化。编辑器只创建一次,它们随网格一起销毁。
我正在使用 ExtJS 5.1.3,我有一个从具有模型的商店加载的网格。网格设置为使用插件 roweditor,所以我编辑一个单元格并给它一个新值,此时红色勾号显示单元格已被更改。
我有一个保存按钮,单击该按钮时会得到 store.getModifiedRecords() 并将其传递给 ajax 请求,此请求成功后会发生一些事情,我执行的最后一个操作是再次加载网格存储,然后用最新版本的数据再次填充网格,这很好并且似乎按预期工作。
因为这是一个多页面应用程序,所以当用户离开此页面时我也会进行检查,这是为了捕获任何未保存的网格更改,所以基本上我从页面获取任何表单并验证 isDirty()值,这是我发现问题的地方,roweditor 被 return 编辑为脏,这是因为某些列有一个编辑器并且 ExtJS 在这些字段上使用表单验证,
我不明白为什么商店再次加载没有清除与网格列关联的任何脏字段?我尝试了很多事情,例如在 ajax 请求之前清除商店以及刷新网格视图,我尝试在执行 ajax 请求之前提交商店更改,但每次我尝试在网格保存后离开页面我选择行编辑器因为它有脏字段:(非常感谢任何帮助。
编辑:设法在一个简单的 fiddle
上复制https://fiddle.sencha.com/#view/editor&fiddle/1rmf
fiddle是最基本的,按照以下步骤复制;
- 编辑第一行年龄,将年龄更改为 13
- 单击“保存”(我正在强制商店加载我们所做更改的数据)
- 单击 'Check roweditor is Dirty() value' 按钮查看 roweditor isDirty() 函数的值,这将 return true
如果您查看按钮处理程序,您可以深入查看表单[0].items.items[2] 并查看该字段有 dirty: true 这就是为什么 isDirty() 是 return 是真的。
解决方案
如接受的答案中所述,行编辑器不受商店 edit/cancel 或我的负载的影响。单击 'Save' 时我所做的是获取网格,然后是编辑器及其表单并在此调用 reset() 以便再次有效地同步所有内容。
grid.editingPlugin.getEditor().form.reset();
您还可以通过 grid.getPlugins() 访问插件,其中 return 是一个数组
已更新 fiddle 以显示其正常工作
我将尝试回答有关我使用全 ExtJS 桌面应用程序的经验。
顺便说一句,快速浏览一下您的描述,您可能需要调用 Store.sync() 方法来刷新您的商店。
再深入一点,使用ExtJs做CRUD的方法有很多
我是使用 store 的 "instance" 创建的,但在某些时候我不得不将其更改为静态调用,如 MyApp.store.Model.save() 等。这使得你只有一个实例存储避免脏数据。
如果你需要,这是我的项目文件夹
https://github.com/guilhermeribeirodev/grizzlyboilerplate/tree/master/src/main/webapp/js/MyApp
在编辑过程中,grid
最终会在 editor
的 form
上调用 loadRecord
。但是在编辑成功或取消时,编辑器的表单不会被清除。这就是为什么您的脏度检查 returns 为假。
重新加载数据的网格不会破坏编辑器。这是一个优化。编辑器只创建一次,它们随网格一起销毁。