我正在尝试使用带有Tree扩展名的dgrid来设置行的样式。为此,我使用了https://github.com/SitePen/dgrid/issues/380中建议的aspect.after,如果你不使用树扩展,它会很好。
但是使用Tree扩展时,网格会在构造函数完成时呈现,因此aspect.after无效。
我的代码是:
require([
'dojo/_base/declare',
'dgrid/OnDemandGrid',
'dgrid/Tree',
'dgrid/Keyboard',
'dgrid/Selection',
'dstore/Memory',
'dojo/aspect',
'dstore/Tree',
'dgrid/extensions/ColumnResizer',
'dojo/domReady!'
], function (declare,OnDemandGrid, tree, Keyboard, Selection, Memory,aspect,TreeStore,ColumnResizer) {
var dataStore = new (declare([ Memory, TreeStore ]))({ data: $jsonData });
var CustomGrid = declare([ OnDemandGrid, tree, Keyboard, Selection, ColumnResizer ]);
var columns = $jsonHeadTitles;
columns[0][0] = tree(columns[0][0]);
var grid = new CustomGrid({
className: 'dgrid-autoheight',
collection: dataStore.filter( { parent: 0 }),
columns: columns,
noDataMessage: 'Sin registros',
shouldExpand: function(){ return true; },
selectionMode: 'single',
cellNavigation: false,
formatterScope: { html: function(item){ return item; }}
}, '$nombre');
aspect.after(grid, 'renderRow', function(row, args) {
var object = args[0];
if (!empty(object.parent)) {
row.className += ' gridchildren';
}
return row;
});
grid.on('dgrid-error', function(event) {
console.error(event.error.message);
});
});
我们如何使用Tree扩展来设置行的样式?
此致
答案 0 :(得分:5)
您的问题与使用Tree
mixin无直接关系;实际上,在第一次渲染时没有它就会遇到同样的问题,因为在这种情况下初始渲染运行后aspect.after
被连接起来(因为网格立即启动并且正在使用的存储是同步)。
有几个选项可以解决这个问题。
一种选择是最初将collection
设置为null
,然后仅在调用aspect.after
后将其设置为您的实际商店。
另一种方法是不将网格绑定到文档流中已有的元素,在这种情况下,在您手动调用grid.startup
之前,初始渲染不会发生,让您有机会调用{{1事先。
或者,您可以将逻辑运行到aspect.after
调用中,以便将功能混合到网格中,而不是在创建实例后使用declare
。例如:
aspect
另外值得注意的是:在dgrid 0.4中将列传递给var Grid = declare([ OnDemandGrid, Tree, Keyboard, Selection, ColumnResizer ], {
renderRow: function (object) {
var rowElement = this.inherited(arguments);
if (!empty(object.parent)) {
rowElement.className += ' gridchildren';
}
return rowElement;
}
});
(正如您在创建网格之前所做的那样)是不正确的。 tree
现在已成为mixin(您已在Tree
来电中正确使用)。