Установите прослушиватель для событий сохранения в контроллере

У меня есть контроллер с хранилищем, моделью и некоторыми представлениями .

Мне нужно прослушивать события beforesync и write хранилища в контроллере, но я не знаю, как установить эти прослушиватели в контроллерах control -функция.

Мой магазин выглядит так:

Ext.define('DT.store.UsersStore', {
    extend : 'Ext.data.Store',
    model : 'DT.model.User',
    id : 'myStore'
    autoSync : true,
    proxy : {
        type : 'ajax',
        api : {
            read : '/load_entries',
            update : '/update_entry'
        },
        reader : {
            type : 'json',
            root : 'user',
            successProperty : 'success'
        }
    }
});

Теперь я пытаюсь прослушать события в моем контроллере:

...
init : function () {
    this.control({
        'myStore' : {
            beforesync : this.doSomething,
            write : this.doSomethingElse
        }
    });
},
...

Мой ожидаемый результат состоит в том, что функции будут выполняться, когда события запускаются . Но в настоящее время ничего не происходит, когда они запускаются.

Как я могу заставить это работать?

28
задан abatishchev 28 August 2011 в 19:06
поделиться

4 ответа

Ext.define('Store', {
    model: 'Model',
    extend: 'Ext.data.Store',
    listeners: {
        'beforesync': function(){
            App.getController('somecontroller').onBeforeSync();
        }
    }
});

App - ваш объект приложения Функция onBeforeSync, которую вы можете реализовать в контроллере ... это единственный способ, которым я могу назначить событие хранилищу и при этом реализовать логику в контроллере. Я надеюсь, что это помогает

4
ответ дан 28 November 2019 в 02:49
поделиться

Я решил это сам.

Я добавил слушателя вручную в render -вент моей панели

Ext.getCmp('userPanel').down('gridpanel').getStore().addListener('write',this.finishedLoading, this);

Спасибо за помощь @nscrob.

4
ответ дан 28 November 2019 в 02:49
поделиться

Надеюсь, что это дополнение поможет кому-то избежать затрат времени на отладку ядра библиотеки:

С этим связано обращение к экземпляру Ext.data.Store внутри Controller с использованием метода get контроллера: например, для вышеупомянутого «DT.store.UsersStore» с помощью this.getUsersStoreStore ():

обратите внимание, что если хранилище уже связано с представлением (например, было объявлено как свойство хранилища для сетки «UsersGrid»). panel.Panel определение виджета), тогда этот метод получения будет фактически извлекать другой экземпляр того же класса Store, а не экземпляр, используемый виджетом! Причина в том, что добавление хранилища в объект конфигурации конструктора выглядит следующим образом :

stores: ['UsersStore']

фактически добавит новый экземпляр хранилища в хеш Ext.data.StoreManager.map, так что - предположим, что «UsersStore» - единственный экземпляр хранилища, созданный на данный момент - ключи карты теперь выглядят так:

0: "ext-empty-store"
1: "UsersStore"
2: "myStore"

Теперь представьте, что вы хотите прочитать некоторые новые данные, используя прокси вашего магазина, и отобразить эти новые данные в «UsersGrid», и вы хотите делать все это, когда пользователь нажимает на что-то, поэтому внутри контроллера вы будет иметь метод-обработчик для пользовательского события с кодом:

'user-selector' : {
    click: function(){
                     var oStoreReference = this.getUsersStoreStore();
                         oStoreReference.load( {params:{} });
            }
    }

Этот вызов для получения ссылки будет переведен внутри this.getStore ('UsersStore') и будет возвращать ссылку на сгенерированный контроллер - 1: "UsersStore" - а не - 2: "myStore" - как и следовало ожидать. Кроме того, вызов load () загрузит экземпляр UsersStore с новыми моделями, и это не будет отражено в вашем представлении сетки (поскольку сетка привязана и прослушивает события, сгенерированные экземпляром хранилища "myStore").

Так что лучше обращайтесь к хранилищу по его itemId, используя общий метод getStore: this.getStore ('storeItemId')

1
ответ дан 28 November 2019 в 02:49
поделиться

Почему бы просто не передать события магазина? Например:

this.getUsersGrid().relayEvents(this.getUsersStoreStore(), ['write'], 'store')

А затем сможете

this.control('somegrid-selector': {storeWrite: function(){...}})

0
ответ дан 28 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

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