Слушатели событий не будут вызываться в IE, что здесь не так?

Технический контекст:

  • додзё 1.8.1
  • dgrid 0.3.4-предварительно
  • IE 10.0.9200

Краткая версия:

У меня есть несколько событий dojo/on, которые я тоже слушаю (из _WidgetBase), но иногда они вызываются, а иногда нет. dgrid, разбивка на страницы и IE в миксе. В чем может быть проблема?

Подробности:

У меня странная ситуация с сеткой dgrid, и, сколько бы я ни пытался, я не смог выделить реальную причину проблемы. Я буду настолько тщательным, насколько смогу, но не стесняйтесь спрашивать дополнительную информацию.

У меня есть компонент dgrid, который использует разбиение на страницы, и поле со списком, в котором есть некоторые значения, по которым я буду фильтровать. Примерно так он устроен (упрощенный, фактический код ссылается на другие модули и имеет более модульную структуру):

// GridContainerWidget
var CustomGrid = declare([Grid, CompoundColumns, Selection, Keyboard, Pagination], {
    selectionMode: "single",
    rowsPerPage: 20
});
var grid = new CustomGrid({
    deselectOnRefresh: false
}, domContainer);

Позже сетка привязывается к JsonStore.

Мой фильтр настроен следующим образом:

// SearchBarWidget
// inside a custom widget, inheriting from _WidgetBase
var self = this;
var statusCombo = new ComboBox({
    store: new Memory(/* data and labels */),
    onChange: function (selection) {
        self.emit("status_changed", self.getSomeData());
    }
}, comboDomContainer);

И вернемся к виджету, который инкапсулирует и фильтр, и сетку:

// GenericListWidget, contains both the SearchBarWidget and the GridContainerWidget
var self = this;
this._searchToolbar.on("status_changed", function (data) {
    // ... some "calibrations" ...
    self._grid.set("query", { newCriteria: "something" });
});

Вот где это становится странным:

  • Иногда в IE будет вызываться emit("status_changed"), но обратный вызов on("status_changed") не будет вызываться. В некоторых других случаях будет вызываться emit и обратный вызов (ожидается).

    • This has to do with the pagination or the grid refresh somehow, but I've not been able to isolate the exact same steps that reproduce the issue
    • Углубившись в это, я увидел, что IE достигает точки, когда он выполняет следующее: (dojo/on, строки с 314 по 322)

      var nativeEvent = target.ownerDocument.createEvent("HTMLEvents");
      nativeEvent.initEvent(type /* "status_changed" */, !!event.bubbles /* true */, !!event.cancelable /* true */);
      // ... copies properties ...
      return target.dispatchEvent(nativeEvent) && nativeEvent; // returns true
      
    • Я убедился, что вызов remove() для подключения к трубке никогда не вызывается.

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

Мой вопрос: как я могу найти основную проблему и убедиться, что мой обратный вызов on() вызывается каждый раз?


person Alpha    schedule 15.11.2013    source источник


Ответы (1)


Вы столкнулись с https://github.com/SitePen/dgrid/issues/379. что было исправлено в dgrid 0.3.7. Чтобы решить проблему, связанную с элементами управления пейджингом в расширении Pagination, вам потребуется либо обновить версию dgrid, либо применить набор изменений самостоятельно.

Это связано с довольно нелепой и раздражающей ошибкой IE, присутствующей в IE9 и IE10 (исправленной в IE11):

person Ken Franqueiro    schedule 15.11.2013
comment
Вероятно, это так. Я применю набор изменений к сетке (поскольку размер моего проекта не позволяет мне легко обновляться), и поскольку эта проблема, похоже, возникает с событиями, запускаемыми ненавигационными якорями, моя проблема должна исчезнуть. Я вернусь с некоторыми результатами! - person Alpha; 16.11.2013
comment
Мне потребовалось некоторое время, но применение исправления непосредственно в качестве примеси помогло. Большое спасибо! - person Alpha; 21.11.2013