Функция слушателя для магазина запускается дважды при обновлении в сетке - PullRequest
2 голосов
/ 26 февраля 2011

У меня есть редактируемая панель сетки Ext.В используемом хранилище есть прослушиватель, который запускает функцию при изменении записи:

listeners:{
    update: someFunction
    }, 

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

Ответы [ 6 ]

2 голосов
/ 17 августа 2012

У меня была такая же проблема (при использовании Ext JS 4.1). Я также искал проблему с двумя экземплярами контроллеров (может быть кому-то полезна, она описана здесь: http://www.sencha.com/forum/showthread.php?179105-Store-loads-amp-duplicates-records-but-API-only-called-once), но после того, как я проверил и убедился, что у меня только один экземпляр контроллера, я искал другое решение.

nicolasbui подсказка работает для меня отлично.

Вот мой код, взятый из магазина:

listeners: {
    load: function(store, records, success, options) {
        console.log("Store: load event.");
    },
    scope: this,
    single: true
}
2 голосов
/ 27 февраля 2011

Изучая документацию ExtJS Store , вы можете посмотреть на событие beforesave (выделено мной):

Запускается до вызова действия сохранения. Сохранение включает уничтожение записей, обновление записей и создание записей .

В качестве альтернативы вы можете использовать ...

store.addListener('update', someFunction, store, {single: true});

... чтобы функция обратного вызова выполнялась только при следующем вызове update.

2 голосов
/ 26 февраля 2011

Я достиг этого, добавив

store.removeListener('update', someFunction);

в начале функции изменения значения в магазине и:

store.addListener('update', someFunction);

в конце.

Может быть, есть лучший способ?

1 голос
/ 02 декабря 2011

Любое событие может быть запущено только один раз, поскольку iit будет автоматически удалено с логической опцией single как true .Используйте это, чтобы получить его:

// as config
listeners: {
    update: {fn: somefunc, single: true }
}
// with adListener()/on()
cmp.on('update', myFunc, scope, { single: true });

И этот синтаксис будет работать на Ext 3/4

Реальное решение, если вам нужно обновить много элементов и запустить только одно событие,просто используйте, как уже упоминалось, suspendEvents () , чтобы приостановить срабатывание события, и resumeEvents () , чтобы отменить приостановку.Просто используйте fireEvent () в конце, чтобы сделать трюк.

1 голос
/ 27 февраля 2011

Мне пришло в голову, что источник вашего двойного огня находится в «Функция меняет некоторые значения в магазине».

Я полагаю, что в EditGridPanel вы можете редактировать / изменять столбцы A, B, C, D, но изменения в A, C в обработчике вносят изменения в «некоторые значения», такие как столбец E. В своем обработчике (someFunction) убедитесь, что которые изменяют форму A, B, C, D, а не E ...

Я не знаю ваш код и что произошло в некоторой функции -> почему он только догадывается

1 голос
/ 26 февраля 2011

ExtJS Store имеет метод suspendEvents, который приостанавливает запуск всех событий, и метод resumeEvents, который возобновляет события запуска.Я полагаю, вы могли бы использовать их вместо удаления и добавления слушателя - это, на мой взгляд, было бы немного «чище».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...