В ExtJS, как я загружаю хранилище, когда я отображаю сетку?

В ExtJS, как я загружаю хранилище, когда я отображаю сетку? Я хочу, чтобы хранилище загрузилось только, когда сетка отображена (пользователь нажимает на кнопку для показа сетки, таким образом, расточительно загрузить хранилище заранее). Я попробовал afterrender слушатель, но это представляет loadmask в неправильном месте, и afterlayout слушатель перезагружает сетку каждый раз, когда сетка изменена.

7
задан Daniel T. 10 February 2010 в 09:50
поделиться

3 ответа

Это одна из тех вещей, которые могут быть немного больно делать, потому что давали браузеру слишком много сделать за один раз (особенно заметно на 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, потому что это значение по умолчанию (т.е. не устанавливайте его вообще) и из вашего описания звучит так, что вы захотите использовать метод загрузки Магазинов, а не перезагружать.

13
ответ дан 6 December 2019 в 14:04
поделиться

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

Например:

  1. Почему бы не заблокировать конкретный сеанс или IP-адрес после того, как, скажем, 5 (быть щедрым здесь) неудачных попыток входа? Ты можешь заблокировать его на 10 минут. Можно даже написать состояние HTTP «401 несанкционированный», а затем просто завершить ответ с помощью Response.End .
  2. Аналогичным образом, но даже не связанным с неуспешными входами в систему, можно блокировать запросы на страницу входа более X раз в Y секундах для определенного IP-адреса, UserAgent и других клиентских функций, что обеспечивает «уникальный» клиент.
  3. Игнорируйте IP-адрес (он легко поддается и может быть IP-адресом прокси-сервера) и просто определите автоматизацию попытки входа в систему. X число неудачных входов в систему в течение Y секунд для определенного имени пользователя/адреса электронной почты, блокировка этого имени пользователя на заданный период времени и завершение ответа.

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

Очевидно, что выполнение этого на аппаратном уровне - брандмауэры и т.д. было бы предпочтительным вариантом.

-121--3879705-

array.length = 0 или array.splice () лучше всего подходит для общей производительности.

array.splice (0); будет работать быстрее, чем array.splice (array.length - 1, 1);

-121--2140040-

Вы рассматривали возможность обработки активировать событие? Можно добавить обработчик событий, который загружает данные о событии activate и затем удаляет его.

this.on('activate', function(){
 this.un('activate', arguments.callee);
    this.store.load();
}, this);

Здесь этот ссылается на GridPanel .

2
ответ дан 6 December 2019 в 14:04
поделиться

Вы можете установить значение autoLoad равным false для магазина и просто вызвать функцию store.reload(); когда пользователь нажимает на кнопку, чтобы показать сетку.

0
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

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