我对dgrid有个问题...我有一个AccordionContainer,在它的每个ContentPane中,我放置了一个dgrid。dgrid的问题是: 1-滚动错误:当向下滚动时,滚动会在某些时刻“跳过”并跳到末尾,并且无法向上滚动并显示第一条记录。(我在Firebug中看到错误TypeError:滚动失败时grid._rows为null )。2-尝试更改值:听起来没有发出dgrid-datachange事件,无法在编辑值后捕获事件。
我认为这些错误与dgrid的内部布局( ContentPane内部的dgrid、AccordionContainer内部的dgrid)有关。我还包括了DijitRegistry扩展,但即使有了这个扩展,我也无法摆脱这个错误。我准备了这个重现错误的小提琴:
https://jsfiddle.net/9ax3q9jw/5/
代码:
var grid = new (declare([OnDemandGrid, DijitRegistry,Selection, Selector, Editor]))({
collection: tsStore,
selectionMode: 'none',
columns:
[
{id: 'timestamp', label:'Timestamp', formatter: function (value,rowIndex) {
return value[0];
}},
{id: 'value', label: 'Value',
get: function(value){
return value[1];
},
editor: "dijit/form/TextBox"
}
],
showHeader: true
});
grid.startup();
grid.on('dgrid-datachange',function(event){
alert('Change!');
console.log('Change: ' + JSON.stringify(event));
});
//Add Grid and TextArea to AccordionContainer.
var cp = new ContentPane({
title: tsStore.name,
content: grid
},"accordionContainer");感谢你的帮助,谢谢你,安吉尔。
发布于 2015-04-14 23:29:04
这个示例中有几个问题可能会给您带来问题。
数据
小提琴中使用的存储区是使用数组数组创建的,但存储区旨在使用对象数组。这就是你所看到的滚动问题的根源。每个对象中的一个属性应该唯一地标识该对象( 'id‘字段)。如果没有条目in,网格就无法正确跟踪数据集中的条目。数据数组可以很容易地转换为对象数组,每个条目都有timestamp和value属性,商店可以使用timestamp作为其ID属性(用于唯一标识每条记录的属性)。
var records = [];
var data = _globalData[0].data;
var item;
for (var i = 0; i < data.length; i++) {
item = data[i];
records.push({
timestamp: item[0],
value: item[1]
});
}
var tsStore = new declare([Memory, Trackable])({
data: records,
idProperty: 'timestamp',
name: 'Temperature'
});
_t._createTimeSeriesGrids(tsStore);以这种方式设置存储还可以简化网格列的定义。使用字段名而不是ID将允许网格使用每个行对象的相应字段值调用formatter函数。
columns: [{
field: 'timestamp',
label: 'Timestamp',
formatter: function (value) {
return value;
}
}, {
field: 'value',
label: 'Value',
formatter: function (value) {
return value;
},
editor: "dijit/form/TextBox"
}],正在加载
小提琴使用声明性小部件和Dojo的自动解析功能来构建页面。在这种情况下,加载器回调在执行之前不会等待解析器完成,因此在回调运行时小部件可能还没有被实例化。
有两种方法可以处理这个问题:dojo/ready或显式使用解析器。
parseOnLoad: true,
deps: [
...
dojo/ready,
dojo/domReady!
],
callback: function (..., ready) {
ready(function () {
var _t = this;
var _globalData = [];
...
});
}或
parseOnLoad: false,
deps: [
...
dojo/parser,
dojo/domReady!
],
callback: function (..., parser) {
parser.parse().then(function () {
var _t = this;
var _globalData = [];
...
});
}布局
在向容器添加小部件时,请使用Dijit的方法,如addChild和set('content', ...)。它们通常执行的操作不只是将小部件添加到DOM,如启动子小部件。
var cp = new ContentPane({
title: tsStore.name,
content: grid
});
registry.byId('accordionContainer').addChild(cp);而不是
var cp = new ContentPane({
title: tsStore.name,
content: grid
}, "accordionContainer");在示例代码中,甚至不需要ContentPane,因为dgrid继承自DijitRegistry --它可以直接作为AccordionContainer的子级添加。这也将调用网格的启动方法,因此不需要在代码中显式调用。
registry.byId('accordionContainer').addChild(grid);在网格初始呈现后,通常还需要重新布局网格的容器,以确保其大小合适。
var handle = grid.on('dgrid-refresh-complete', function () {
registry.byId('accordionContainer').resize();
// only need to do this the first time
handle.remove();
});https://stackoverflow.com/questions/29628695
复制相似问题