2015-11-28 1 views
2

Я пытаюсь сохранить состояние сетки с помощью Ext.state.CookieProvider. Проблема в том, что я не могу восстановить параметры сортировщиков, пока само состояние (ширина, порядок) восстанавливается должным образом.Государственный провайдер не восстанавливает сортировщики правильно

Сначала я создал cookieprovider в Init() метод видового экрана ViewController:

Ext.state.Manager.setProvider(Ext.create('Ext.state.CookieProvider', {})); 

Мой магазин установлен режим нагрузки с дистанционной сортировкой:

Ext.define('MyApp.requests.store.QueryRequestsGridStore', { 
    extend: 'Ext.data.Store', 
    model: 'MyApp.requests.model.QueryRequestsGridModel', 
    alias: 'store.queryRequestsGrid', 
    remoteSort: true, 
    autoLoad: true, 
    proxy: { 
     startParam: 'offset', 
     limitParam: 'limit', 
     url: '/requests', 
     noCache: false, 
     type: 'ajax', 
     reader: { 
      type: 'json', 
      rootProperty: 'data', 
      totalProperty: 'total' 
     } 
    }, 
}); 

Магазин определяется в сетке используя привязку вида просмотра:

bind: { 
    store: '{queryRequestsGrid}' 
}, 

Я загружаю сетку, содержащую магазин из viewp орт ViewController на кнопку мыши, как это:

var panelToAddName = Ext.create('MyApp.requests.view.QueryRequestsGridView', {}); 
var mainViewPort = Ext.ComponentQuery.query('#mainViewPort')[0]; 
var regionPanel = mainViewPort.down('[region=center][xtype=panel]'); 
regionPanel.removeAll(); 
regionPanel.add(panel); 

Cookie содержит сортировщики, но сетка загружается без каких-либо параметров сортировки.

"storeState":{"sorters":[{"root":"data","property":"date_completed","direction":"ASC"}]}}} 

Я вырыл в исходный файл внутр-все-debug.js и нашел initState() метод класса А «Ext.state.Stateful».

initState: function() { 
     var me = this, 
      id = me.stateful && me.getStateId(), 
      hasListeners = me.hasListeners, 
      state, combinedState, i, len, plugins, plugin, pluginType; 
     if (id) { 
      combinedState = Ext.state.Manager.get(id); 
      if (combinedState) { 
       state = Ext.apply({}, combinedState); 
       if (!hasListeners.beforestaterestore || me.fireEvent('beforestaterestore', me, combinedState) !== false) { 

        plugins = me.getPlugins() || []; 
        for (i = 0 , len = plugins.length; i < len; i++) { 
         plugin = plugins[i]; 
         if (plugin) { 
          pluginType = plugin.ptype; 
          if (plugin.applyState) { 
           plugin.applyState(state[pluginType], combinedState); 
          } 
          delete state[pluginType]; 
         } 
        } 

        me.applyState(state); 
        if (hasListeners.staterestore) { 
         me.fireEvent('staterestore', me, combinedState); 
        } 
       } 
      } 
     } 
    }, 

Если войти me.store изнутри этого метода, магазин показан на консоли, как доба-пустому-магазин в то время как меня мои нагруженные сеток. Кажется, что состояние применяется до того, как хранилище правильно загружено.

Если повторное использование метода initState внутри события сетки beforerender, сортировщики восстанавливаются из файла cookie.

Любые предложения?

+0

Я бы предложил сделать действительно простую скрипку sencha (сетка с одной колонкой, загрузка магазина с одним полем и т. Д.), Который показывает проблема. И затем вы публикуете его как ошибку на форуме sencha. – Alexander

+0

Одна вещь, которую я только что отметил: вы можете опубликовать свой код, где/как вы добавили хранилище в сетку, и где/как вы добавили состояние в сетку. Существует несколько способов добавления хранилища ('store: 'MyStoreId'' и' store: Ext.create (' MyApp.store.MyStore ') ', которые могут демонстрировать разные типы поведения. – Alexander

+0

@Alexander, я добавил код вы предложили, не поможет ли это? Если нет, я сделаю скрипку sencha. – fen1ksss

ответ

1

Я не работал с привязкой к viewmodel как единственная привязка между хранилищем и сеткой и не могу прокомментировать, должно ли это работать вообще или просто случайно.

Но я знаю, что viewmodel обрабатывается очень поздно, потому что представление должно быть полностью инициализировано первым (включая applyState), поэтому viewmodel может найти все компоненты, к которым он хочет привязать слушателей.

Поэтому, пожалуйста, попробуйте добавить магазин, используя любой из двух методов «старой школы», которые работают даже без viewmodel: store:'MyStoreId' или store:Ext.create('MyApp.store.MyStore') на сетке. Таким образом, магазин должен быть привязан к сетке до applyState.

Кроме того, я вижу другую проблему, которую вы должны указать: ваш магазин загружается непосредственно после запуска магазина. (autoLoad:true). В то время он еще не привязан к сетке; таким образом, не был применен тип sort/filter, что означает, что с включенным remoteSort/remoteFilter, вы отправляете слишком много запросов на сервер. Я бы рекомендовал загрузить хранилище только после того, как он был применен к сетке (в grid.initComponent после вызова callarrent или из grid.boxready слушателя).Если вы действительно хотите использовать autoLoad, я бы рекомендовал посмотреть на метод setAutoLoad

+0

Благодарим вас за ответ, это правильно, чтобы установить autoLoad в false и использовать store: Ext.create ('MyApp.store.MyStore', {}) метод похоже, исправляет поведение. Теперь я подумываю о том, как обращаться с viewmodel таким образом. – fen1ksss

Смежные вопросы