@KislyFan
инженер, связист и просто любитель выпить

Как получить доступ к store созданному в контроллере?

Изучаю примеры по 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 не передавая их явно ?
  • Вопрос задан
  • 337 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы