我正在使用ExtJS将数据加载到网格中,我想在数据完全放入网格后添加一些额外的进程。
我的上下文是,在将数据放入网格后,我将检查所有行,并根据指定的条件将其中一些标记为禁用,并将工具提示放入行(解释为何禁用它)。我尝试使用2个事件:Grid的'afterrender'和网格存储的'load',但它们不起作用。
因为grid's 'afterrender'
在第一次网格初始化时被触发,所以不关心数据加载。当数据被预取到存储(不在屏幕上呈现)时,store's 'load'
被触发,所以我无法让行<div>
将其设置为禁用。
那么,在网格上完全加载和渲染数据时检测的事件是什么?我该如何实现这一要求?
答案 0 :(得分:8)
您是否尝试过viewready
?
Ext.create('Ext.grid.Panel', {
// ...
viewConfig: {
listeners: {
viewready: function(view) {
// ...
}
}
}
});
答案 1 :(得分:5)
您可以直接点击商店的load
活动,或通过网格转发活动。
在网格类中,可能在initComponent
函数中,放入以下内容,
this.relayEvents(this.getStore(), [ 'load' ]);
答案 2 :(得分:2)
我认为对于您而言,您无需等到网格加载,而是使用网格面板的viewConfig
选项来配置显示行的准确程度:
viewConfig: {
getRowClass: function(r) {
if (r.get('disabled'))
return 'disabled-class';
else
return '';
}
}
答案 3 :(得分:2)
如果您使用setTimeout
函数,它将在渲染完成后强制执行调用,它在我遇到的类似情况下工作。
listeners: {
'afterrender': function(grid) {
setTimeout(function(){
// ...
答案 4 :(得分:1)
我意识到这是一个老问题,但我最近不得不修复一个旧的ExtJS(4.0.2)应用程序中的滚动问题,当html(例如&lt; table&gt;标记)实际更新时,我需要一个触发/事件/插入网格视图中。
以下脚本添加了新的&#34;更新&#34; 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版本的脚本。
<强>更新强>
我发现新的&#34;更新&#34;当视图呈现空存储时,事件未触发。作为一种解决方法,我扩展了视图的刷新方法。
(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!
}
}
});
})();
答案 5 :(得分:0)
使用getForm()。load()上的success:属性来调用函数来处理后加载处理
答案 6 :(得分:0)
viewready
为我工作!!!
在控制器中配置如下:
Ext.define('App.controller.Dashboard', {
extend: 'Ext.app.Controller',
init: function() {
this.control({
'#summary-bottom-grid': {
viewready: function(cmp){
var link = Ext.DomQuery.selectNode('span.summary-status',cmp.body.dom);
}
}
});
}
}
答案 7 :(得分:0)
我使用extjs 4.2.3,这很有用。
我用过这个:
this.grid = Ext.create('Ext.grid.Panel',{
store: this.ds,
margins: '0 0 0 10', // top right button left
title: lng.menu.caption.mailHeaderGrid,
selType: 'checkboxmodel',
columns:[...],
selModel: {
renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
var baseCSSPrefix = Ext.baseCSSPrefix;
metaData.tdCls = baseCSSPrefix + 'grid-cell-special ' + baseCSSPrefix + 'grid-cell-row-checker';
return (record.get('status') =='lng.label.surveyFinalized') ? '' : '<div class="' + baseCSSPrefix + 'grid-row-checker"> </div>';
},
},
对我来说,我在Chrome上工作!