В ExtJS, как я загружаю хранилище, когда я отображаю сетку? Я хочу, чтобы хранилище загрузилось только, когда сетка отображена (пользователь нажимает на кнопку для показа сетки, таким образом, расточительно загрузить хранилище заранее). Я попробовал afterrender
слушатель, но это представляет loadmask в неправильном месте, и afterlayout
слушатель перезагружает сетку каждый раз, когда сетка изменена.
Это одна из тех вещей, которые могут быть немного больно делать, потому что давали браузеру слишком много сделать за один раз (особенно заметно на IE).
Мне нравится использовать комбинацию отложений, чтобы позволить браузеру восстанавливаться достаточно долго для правильной визуализации.
var grid = new Ext.grid.GridPanel({
...,
listeners : {
render : function(grid){
grid.body.mask('Loading...');
var store = grid.getStore();
store.load.defer(100, store);
},
delay: 200
}
});
Играя со значением задержки/переноса, вы должны получить желаемый результат. Длительность времени, которое вам нужно будет отложить/отложить, зависит от того, насколько сложен ваш Grid и насколько быстр браузер.
Также не забудьте удалить маску по окончании загрузки вашего Магазина.
listeners: {
load: function(){
yourGrid.body.unmask();
}
}
ЗАМЕЧАНИЕ: Всего несколько пояснений к ответу Ллойда - вам не нужно устанавливать autoLoad в false, потому что это значение по умолчанию (т.е. не устанавливайте его вообще) и из вашего описания звучит так, что вы захотите использовать метод загрузки Магазинов, а не перезагружать.
Я не собираюсь отвечать на ваш конкретный вопрос, как многие уже сделали это, но есть гораздо лучшие способы предотвращения грубых силовых атак.
Например:
Response.End
. Просто говоря, что есть другие варианты, чем излишняя нагрузка на ваш сервер путем блокировки некоторых ресурсов и ожидания.
Очевидно, что выполнение этого на аппаратном уровне - брандмауэры и т.д. было бы предпочтительным вариантом.
-121--3879705- array.length = 0
или array.splice ()
лучше всего подходит для общей производительности.
array.splice (0);
будет работать быстрее, чем array.splice (array.length - 1, 1);
Вы рассматривали возможность обработки активировать
событие? Можно добавить обработчик событий, который загружает данные о событии activate
и затем удаляет его.
this.on('activate', function(){
this.un('activate', arguments.callee);
this.store.load();
}, this);
Здесь этот
ссылается на GridPanel
.
Вы можете установить значение autoLoad равным false для магазина и просто вызвать функцию store.reload(); когда пользователь нажимает на кнопку, чтобы показать сетку.