技术背景:
- 道场 1.8.1
- dgrid 0.3.4-pre
- 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 并且也会调用回调(预期)。- 这与分页或网格刷新有关,但我无法隔离重现问题的完全相同的步骤
在深入研究这一点时,我看到 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() 回调?