Технический контекст:
- додзё 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() вызывается каждый раз?