技術的背景:
- 道場 1.8.1
- dgrid 0.3.4-pre
- IE 10.0.9200
短縮版:
私も (_WidgetBase から) リッスンしている dojo/on イベントがいくつかありますが、呼び出される場合と呼び出されない場合があります。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() コールバックが毎回呼び出されるようにするにはどうすればよいですか?