Extjs MVC - настройка магазина событий в контроллере - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть требование в моем приложении, где мне нужно показать компоненты пользовательского интерфейса (например, текстовое поле, поле со списком) на основе значений, которые я получаю со стороны сервера.Если быть точным, у меня есть комбинированный список на странице, когда пользователь изменяет значения, которые мне нужны, чтобы отправить выбранное значение на сервер, чтобы получить информацию о том, что должно отображаться.Без использования MVC я реализовал его следующим образом:

  1. Когда пользователь изменяет значение в выпадающем списке, я обновляю (используя метод загрузки) другое хранилище
  2. Когда я получаю данные изсервер (событие «datachanged») Я читаю данные и создаю компоненты пользовательского интерфейса

Теперь я пытаюсь использовать ExtJS MVC, поэтому у меня есть два вопроса

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

Код я хочу настроить события из Store как 'datachanged' в контроллере, как показано ниже -

this.control({
    'viewport > #content-panel' : {
        render : this.createMainTabs
     }
});

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

В дополнение к ответу ша я могу сказать, что вы можете настроить обработчики событий вашего магазина в вашем контроллере. Например, у вас есть комбинированный список с магазином, так что вы можете написать так:

this.control({
    '#myCombo' : {
        afterrender : this.setupStoreListeners
     }
});

....

setupStoreListeners: function(combo){
    var store = combo.store;
    store.on('datachanged', //.....);
}

И еще одна вещь, как писал Ша, вы всегда можете получить хранилище по имени, но я использую это, только когда мне нужно разделить экземпляр хранилища между несколькими контроллерами. Если мне нужно это хранилище только в одном контроллере, я просто сохраняю его внутри этого контроллера:

setupController: function(){
   this.myStore = this.getCombo().store; // now you could use this.myStore anywhere you need

}
1 голос
/ 01 марта 2012

Чтобы получить объект хранилища в контроллере, просто используйте this.getStore('StoreName'), каждое хранилище по умолчанию имеет свой собственный экземпляр, и не имеет значения, привязано ли оно к какому-либо компоненту пользовательского интерфейса.

ПослеХранить объект вы можете подписаться на любые события магазина, используя любой метод, который вы предпочитаете.Мне обычно нравится

store.on('load', {...})

Также я бы ничего не изменил в интерфейсе из кода представления.Я бы положил всю эту настройку в код контроллера.

...