让用户能够在本地存储数据,直到他决定全部上传数据。为实现这一目标,我将表单中的数据填充到模型中,然后使用此模型填充商店(同步)。这个商店有一个本地存储代理 offlineStore.js :
Ext.define('blahblah.store.offlineStore',{
extend:'Ext.data.Store',
config:{
model:'blahblah.model.myModel',
id: 'offlineRegisterStore',
sorters:'xyz',
grouper:function(record){
return record.get('xyz')[0];
},
proxy: {
type: 'localstorage',
id: 'offlineRegisterStoreid'
}
...
现在,当用户按下同步按钮时,我将数据从此脱机存储复制到另一个具有执行REST调用的代理的商店:
OnlineStore :
Ext.define('blahblah.store.upStore', {
extend: 'Ext.data.Store',
config: {
model: 'blahblah.model.myModel',
id: 'abc',
sorters: 'xyz',
grouper: function (record) {
return record.get('xyz')[0];
},
proxy: {
type: 'rest',
url: HOST,
headers: HEADERS,
reader: {
type: 'json'
},
writer: {
type: 'json'
}
...
不幸的是,在我从离线商店添加数据后,我的在线商店甚至没有执行store.sync()
。因此,不会进行REST调用。我意识到当商店没有同步数据时会发生这种情况。这很奇怪,因为在从离线商店向其中复制数据之前,我没有向在线商店添加任何内容。
我创建后立即在在线商店上做了console.log
。我看到这个商店已经填写了表单数据。而且,我猜这就是为什么sync()
没有被执行的原因,因为我将这些相同的数据添加回来,只是这次,来自离线商店。我对这个在线商店如何以及从何处获取数据感到困惑
在我将离线商店中的任何内容添加到在线商店之前,我还尝试了store.removeAll()
,但它对商店内容没有任何影响。
告诉您是否需要查看更多代码。
编辑1 :我如何填充离线商店 - 我创建了我的模型实例,填写表单数据并执行offlineStore.add(myModel)
。在此之后我做offlineStore.sync()
。这就是我用模型填充模型的方法:
var myModel = Ext.create('blahblah.model.myDataModel',{
datafield1 = formdata1,
datafield2 = formdata2
});
我在什么时候查看在线商店:
当用户点击表单的提交按钮时,我获取离线商店和创建在线商店。令人惊讶的是,我只是观察到,不仅是在线商店,甚至离线商店都有我getStore
时的表单数据。所以基本上数据甚至在我对它们执行sync()
或添加数据填充模型之前就进入了离线和在线商店?这让我更加困惑。
答案 0 :(得分:2)
最后通过Sencha forums:设置record.phantom = true
找到了我的问题的解决方案。
在将记录添加到在线商店(从离线商店)之前,我执行了上面的代码。现在,当商店同步时,它认为新添加的记录确实是新记录,因此执行了POST请求。
我还必须补充一点,如果您改为设置record.dirty = true
,那么商店会发送PUT请求而不是POST。
答案 1 :(得分:0)
如果您说“将表格中的数据填充到模型中”,我猜两个商店都会获得该数据,因为它们都绑定到该模型。您到底在什么时候检查在线商店并查看表单数据?是否在表单内的每次击键时都会更新?
关于如何解决这个问题的一些想法:
没有Ext.data.Store
离线数据 - 您可能希望将数据存储在完全独立的结构中,直到用户提交它为止,某种自定义表单支持对象而不是离线商店。这可能意味着复制模型的某些部分,但肯定有一种方法可以防止这种情况(例如在其他地方定义字段并使用它们扩展ExtJS模型和自定义对象)。
覆盖sync
功能并过滤数据 - 您可以添加模型属性submitted
并覆盖商店的同步方法,以仅同步具有{{{ 1}}。因此,在本地,您拥有商店中的所有数据,但只将已批准的数据项传输到服务器。
同一商店对象 - 您是否恰好以不同的名称拥有相同的商店对象?您正在定义具有不同ID的不同商店,但您是否检查过它们实际上是不同的?听起来他们现在可以随时保留相同的数据吗?!
如果有帮助,请告诉我。