Решение проблемы со временем в ExtJS 3 (после patch'а KB2998527)

Всем доброго времени суток!

Прочитав очередную статью про проблему со временем в JavaScript (для браузеров Windows (RU) после patch'а KB2998527), я стал понимать, что мало кто приводит общее решение для ExtJS 3.

Вероятно, вы уже в курсе проблемы, а если нет, то стоит прочесть статью «Хром, укравший рождество». Она важна для веб-разработчиков, клиенты которых из РФ.

Ещё до появления статьи наткнулся на этот баг. Сначала я и мой коллега подумали, что проблема с обновлением Chrom'а, но через час уже нашли компонент, который и приводил к зависанию, им оказался Ext.form.TimeField. Дальнейший анализ привёл к функции:

generateStore: function(initial){
        var min = this.minValue || new Date(this.initDate).clearTime(),
            max = this.maxValue || new Date(this.initDate).clearTime().add('mi', (24 * 60) - 1),
            times = [];

        while(min <= max){
            times.push(min.dateFormat(this.format));
            min = min.add('mi', this.increment);
        }
        this.bindStore(times, initial);
    }

Как видите, для получения значений используется цикл. На тот момент я его изменил на for c 0 до (24 * 60) / this.increment.

Но уже после, поняв, в чём проблема (в нашем случае this.initDate = '1/1/2008', где следующий «пропавшая» среда 02/01/2008), написал небольшой патч:

Ext.override(Ext.form.TimeField, {
    initDate: '2/1/2008'
});

Т.е. мы всего лишь указываем день, чтобы следующий не был средой, подробнее. Для новых версий всё аналогично, они там так же используют initDate как 1/1/2008.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 7

    +1
    У нас использование TimeField приводило к зависанию не только Chrome, но и IE 9, 10. Причем в обоих браузерах возникала сильная утечка памяти. Код компонента не правили, так как давно намечался переход поддерживаемых систем на более новую версию Ext. Перенесли приложение на ExtJS 4 — зависание прекратилось.
      +2
      Наше веб-приложение так просто не перенести, потому пришлось создавать патч. В версиях 4+ этот компонент сильно изменился, но цикл и там находил. Вот кусок из Ext-picker-Time:

      createStore: function() {
              var me = this,
                  utilDate = Ext.Date,
                  times = [],
                  min = me.absMin,
                  max = me.absMax;
      
              while(min <= max){
                  times.push({
                      disp: utilDate.dateFormat(min, me.format),
                      date: min
                  });
                  min = utilDate.add(min, 'mi', me.increment);
              }
      
              return new Ext.data.Store({
                  model: me.modelType,
                  autoDestroy: true,
                  data: times
              });
          }
      
      +1
      А-а-а-а! Ты сделал всю мою работу на сегодня!
        +1
        Рад, что помогло. Решение должно сработать для компонентов, расширяемых этот основной Ext.form.TimeField, такие как: Ext.ux.form.DateTimeField, Ext.ux.form.DateField.
        +1
        А как нашли компонент, который приводил к зависанию?
        Я вот, можно сказать, почти случайно — хром сразу умирал почти, а вот FF предлагал запустить отладку, открывал свой отладчик, и ставил точку останова на одну из строк как раз в цикле, после чего почти сразу зависал. Вспомнил о Вашем посте, решил попробовать и все получилось.
          0
          Изначально мой коллега отлаживал код (исходник) «по кускам» (удалял, вставлял вывод в консоль), так он добрался до компонента. Я же через Chrome указал точку останова в «Event Listener Breakpoints» (я выбирал DOM Mutation), потом уже в коде, далее как обычно.
            0
            Забыл указать, что сам компонент отлаживал с помощью Ext.override (у нас приложение собирается, потому сложно подключать файл ext-all-debug.js).

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

          Самое читаемое