Динамический прокси-URL для store.load() в архитектуре MVC с Ext JS

#extjs #proxy #extjs4

#extjs #прокси #extjs4

Вопрос:

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

Подробно:

Я создал MVC-модель, создав представление, контроллер, модель и хранилище, как определено архитектурой EXTJS4. Представление представляет собой сеточную панель. Он определяет хранилище в своем собственном операторе define:

 Ext.define('P.view.MyView' ,{
    extend: 'Ext.grid.Panel',
    alias : 'widget.MyView',
    ...
    store: 'MyStore',
    ...
}
  

Когда я загружаю хранилище с помощью «автозагрузка: истина», все работает нормально, но, конечно, прокси-сервер становится статичным, как определено в коде. Когда я не использую «автозагрузку» и пытаюсь установить «extraParams» и загрузить хранилище в «initComponent» моего представления, например:

 initComponent: function() {
    ...
    this.store.load();    
    ....
  

Я получаю сообщение об ошибке: у объекта «MyStore» нет метода «load».

Как мне это сделать?

Комментарии:

1. вы уверены, что это не синтаксическая ошибка… this.store.load();

2. Да, это было. Исправлено.

Ответ №1:

Я бы добавил, что другим распространенным способом загрузки данных в последний момент является прослушивание afterrender в самой сетке следующим образом:

        listeners: {
             afterrender: function(grid) {
                grid.store.getProxy().url = 'request/my.json'; //modify your URL
                grid.store.load();    
             }
        }
  

Как вы можете видеть, вы также можете влиять на настройки своего хранилища и прокси. Это помогает повторно использовать хранилища для похожих сеток.

Ответ №2:

При вызове this.store.load() в initComponent хранилище еще не инициализировано. Свойство this.store является строкой в момент вызова. Вы должны вызвать загрузку после того, как был вызван родительский элемент вашего виджета initComponent (где происходит инициализация хранилища).:

 initComponent: function() {
    ...
    this.callParent(arguments);
    this.store.load();    
    ....
  

Комментарии:

1. Дополнительный вопрос: где и как я должен влиять на «дополнительные параметры». Я не могу сделать это в самом представлении (т. Е. перед сохранением. загрузить), потому что только компонент, реализующий представление (и его хранилище), знает подробности.

2. @heinob, это зависит от обстоятельств. При каких условиях дополнительные параметры должны быть изменены?

3. У меня есть панель вкладок. Панель сетки (MyView) добавлена в качестве новой вкладки. Содержимое сетки (хранилище, загруженное через прокси) зависит от обстоятельств вне представления, но известно функцией, которая добавляет вкладку / представление.

4. @heinob, я думаю, что лучшим местом была бы функция, которая добавляет вкладку / просмотр. Если эта функция находится в контроллере, вы можете получить доступ к своему хранилищу с помощью средства получения хранилища контроллера. F.i. если ваше хранилище называется «MyStore», вы можете получить к нему доступ через this.getMyStoreStore() .