Store sync () оказался очень сложным для меня, это может помочь пролить некоторый свет.
.sync()
не будет обновлять записи удаленного локального хранилища, если они не загрязнены.Таким образом, они не будут постоянными.
С помощью считывателя типа json легко допустить ошибку непосредственного изменения записи, для этого нужно использовать методы Модели, в частности .set()
, поскольку установлен() определяет запись как «грязную», и только тогда sync () фактически сохранит изменения.
Это особенно трудно отладить с использованием локального хранилища.
Для следующего магазина:
Ext.define('MyApp.store.LocalStuff',{
extend: 'Ext.data.Store',
xtype:'localstuff',
config: {
fields:['stuffId','stuffName','stuffArray'],
storeId:'LocalStuffId',
autoLoad:false,
proxy:{
type:'localstorage',
id:'idForLocalStorage',
reader: {
type: 'json',
rootProperty: 'stuffArray'
}
}
}
});
Предполагая, что вы наполнили магазин чем-то вроде:
{'stuffArray':[
{'stuffId':'130', 'stuffName':'floob', 'stuffArray':[
'first',
'second',
'tird' //here be a typo (on purpose)
]
},
{'stuffId':'131', 'stuffName':'sateo', 'stuffArray':[
'primero',
'segundo',
'tercero'
]
},
{'stuffId':'133', 'stuffName':'tolus', 'stuffArray':[
'prima',
'secunda',
'tertia'
]
}
]
}
Чтобы исправить ошибку записи первой записи, у вас может возникнуть соблазн сделать следующее:
{//in a given controller or view
someEventHandler:function(){
var stor = Ext.getStore('LocalStuffId');
var firstRecord = stor.getAt(0);//which will get you a record in the form of a Model
firstRecord.get('stuffArray')[2]='third';//that will fix it
//now we just sync() to make the change persist when we close the app
stor.sync();
}
}
Если вы попробовали это, на консоли не будет ошибок, так что все в порядке.Правильно?
Неверно!Изменения не сохранятся при перезапуске.Зачем?
Потому что записи «чистые».
Как мы можем «испачкать» их?
Единственный способ, который я нашел (я уверен, что их гораздо больше), - это использование метода .set () * 1033.* из модели, чтобы обновить запись, которая сообщит магазину, что она грязная
Это звучит странно для моего неподготовленного мозга на MVC, лучше исправить приведенный выше пример.
{//in a given controller or view
someEventHandler:function(){
var stor = Ext.getStore('LocalStuffId');
var firstRecord = stor.getAt(0);//which will get you a record in the form of a Model
//you might go around the following 2 lines in many ways, the important part is .set() after that
var theArrayToFix = firstRecord.get('stuffArray');
theArrayToFix[2]='third';
firstRecord.set('stuffArray',theArrayToFix);//set() dirties the record
//NOW we sync() to make the change persist when we close the app
stor.sync();
}
}
Все этоЭто может быть очевидно для кого-то, пришедшего с сенча touch 1, но для новичка, такого как я, это было близко к дневной работе, чтобы выяснить.
Надеюсь, это кому-нибудь поможет, это наверняка поможет мне в будущем.1041 *