我意识到这是一个老问题,但我最近不得不修复一个旧的 ExtJS (4.0.2) 应用程序中的滚动问题,我需要一个触发器/事件来处理 html(例如 <table> 标签)实际上被更新/插入到网格视图。
以下脚本将新的“更新”事件添加到 Ext.grid.View。将 html 插入视图后会触发 update 事件。
(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!
}
}
});
})();