0

技术背景:

  • 道场 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() 回调?

4

1 回答 1

0

您遇到了https://github.com/SitePen/dgrid/issues/379,它已在 dgrid 0.3.7 中修复。要解决与分页扩展中的分页控件有关的问题,您将需要更新您的 dgrid 版本或自己应用变更集。

这是由于 IE9 和 IE10(在 IE11 中修复)中存在一个相当可笑和烦人的 IE 错误:

于 2013-11-15T05:11:34.407 回答