Изучаю примеры по ExtJs 6 и пытаюсь повторить. Вот тут дан пример смены удаленного хранилища на локальное
https://habr.com/ru/post/138054/ и пытаюсь повторить.
Затруднение вызвали вот эти фрагменты
UsersApp.Utils.ping({
success: this._onPingSuccess, // Интернет есть
failure: this._onPingFailure // Интернета нет
}, this);
где
_onPingSuccess: function(){
// сеть есть
var win = Ext.ComponentQuery.query('#usersWindow')[0];
var storeLocal = this.getStore('storeLocal');
var store = this.getStore('store');
var grid = win.getComponent('NamesGrid');
UsersApp.Utils.ping это обертка над Ext.Ajax.request, но автор не раскрывает код. Когда _onPingSuccess или _onPingFailure выполняются, this ссылается на обьект Window, у которого нет метода getStore.
Полный код контроллера
Ext.define("Apple.controller.Main", {
extend: 'Ext.app.Controller',
requires: [
'Apple.utils.Ping',
'Apple.store.OrderStore',
'Apple.store.UserStore'
],
init: function(){
Ext.define("Session", {
extend: "Ext.data.Session",
});
var session = Ext.create("Session");
var store = Ext.create("Apple.store.OrderStore", {
storeId: 'OrderStore',
session: session
});
store.setProxy(
Ext.create('Ext.data.RestProxy', {
type: 'rest',
url: 'https://localhost:5001/api/order',
api: {
create: 'https://localhost:5001/api/order',
read: 'https://localhost:5001/api/order',
update: 'https://localhost:5001/api/order',
destroy: 'https://localhost:5001/api/order'
},
writer: {
type: 'json',
writeAllFields : false, //just send changed fields
allowSingle : true //always wrap in an array
},
reader: {
type: 'json',
rootProperty: 'data',
successProperty: 'success'
}
})
);
var local = Ext.create("Apple.store.OrderStore", {
storeId: 'OrderStoreLocal',
session: session
});
local.setProxy(
Ext.create('Ext.data.proxy.LocalStorage', {
type: 'localstorage',
id : 'Orders'
})
);
local.addListener('load', function(){
Apple.utils.Ping.sendPing({
success: this._onPingSuccess,
failure: this._onPingFailure
}, this);
}, this);
// инициируем загрузку локальное хранилище
local.load();
},
_onPingSuccess: function(response, options){
var store = this.getStore('OrderStore');
var local = this.getStore('OrderStoreLocal');
var grid = Ext.getCmp('LayC0Grid');
// выясняем количество записей в локальном хранилище
localCnt = local.getCount();
// проверяем состояние локального хранилища,
// выясняя, необходима ли синхронизация
if (localCnt > 0){
// синхронизация нужна, добавляем записи
// по одной из локального хранилища
// в серверное
for (i = 0; i < localCnt; i++){
var localRecord = local.getAt(i);
var deletedId = localRecord.data.id;
delete localRecord.data.id;
store.add(localRecord.data);
localRecord.data.id = deletedId;
}
// сохраняем серверное хранилище
store.sync();
// очищаем локальное хранилище
for (i = 0; i < localCnt; i++){
local.removeAt(0);
}
}
store.load();
// подключаем к таблице серверное хранилище
grid.reconfigure(store);
grid.store.autoSync = true;
},
_onPingFailure: function(response, options){
var local = this.getStore('OrderStoreLocal');
var store = this.getStore('OrderStore');
var grid = Ext.getCmp('LayC0Grid');
// устанавливаем хранилище таблицы на локальное
grid.reconfigure(storeLocal);
grid.store.autoSync = true;
}
});
Как мне получить storage в _onPingSuccess и _onPingFailure не передавая их явно ?