これは古い質問だと思いますが、最近、古い ExtJS (4.0.2) アプリのスクロールの問題を修正する必要があり、html (例: <table> タグ) が実際に更新/挿入されたときのトリガー/イベントが必要でした。グリッドビュー。
次のスクリプトは、新しい「更新」イベントを Ext.grid.View に追加します。update イベントは、html がビューに挿入された後に発生します。
(function(){
var _setNewTemplate = Ext.grid.View.prototype.setNewTemplate;
Ext.override(Ext.grid.View, {
setNewTemplate: function(){
_setNewTemplate.apply(this, arguments);
var view = this;
var template = this.tpl;
template.overwrite = function(el, values, returnElement){
el = Ext.getDom(el);
el.innerHTML = template.applyTemplate(values);
view.fireEvent("update", view, el); //<--New Event!
return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
};
template.doInsert = function(where, el, values, returnEl) {
el = Ext.getDom(el);
var newNode = Ext.core.DomHelper.insertHtml(where, el, template.applyTemplate(values));
view.fireEvent("update", view, el); //<--New Event!
return returnEl ? Ext.get(newNode, true) : newNode;
}
}
});
})();
新しいイベントを使用するには、新しいイベント リスナーをグリッド ビューに追加するだけです。例:
paymentGrid.view.on("update", function(view, el){ //vs paymentGrid.store.on("load", ...
//do something...
console.log(el);
}, this);
これは ExtJS 4.0.2 を使用して実装されていることに注意してください。ExtJS のバージョンに合わせてスクリプトを更新する必要がある場合があります。
アップデート
ビューが空のストアをレンダリングしているときに、新しい「更新」イベントが発生していないことがわかりました。回避策として、ビューの更新方法を拡張しました。
(function(){
var _refresh = Ext.grid.View.prototype.refresh;
Ext.override(Ext.grid.View, {
refresh: function() {
_refresh.apply(this, arguments);
var view = this;
var el = view.getTargetEl();
var records = view.store.getRange();
if (records.length < 1) {
view.fireEvent("update", view, el); //<--New Event!
}
}
});
})();