以声明方式创建dojox.grid.DataGrid时-如何在字段属性中指定嵌套数据?

以声明方式创建dojox.grid.DataGrid时-如何在字段属性中指定嵌套数据?,dojo,dojox.grid.datagrid,Dojo,Dojox.grid.datagrid,我正在dojo 1.6中使用以下符号创建一个dojox.grid.DataGrid: <table dojoType="dojox.grid.DataGrid"> <thead> <tr> <th field="id">ID</th> <th field="contact.name">Name</th> <th field="contact.tel">T

我正在dojo 1.6中使用以下符号创建一个dojox.grid.DataGrid:

<table dojoType="dojox.grid.DataGrid">
  <thead>
    <tr>
      <th field="id">ID</th>
      <th field="contact.name">Name</th>
      <th field="contact.tel">Telephone</th>
      <th field="contact.birthdate.time">Birthday</th>
    </tr>
  </thead>
</table>
ID正确呈现,但所有其他ID都呈现为“…”。 我试图指定一个格式化程序,将基本对象“contact”设置为 例如,输入字段,然后返回FIELD.name。 这在显示正确的值时起作用,但排序 使用基础对象

我认为可能有一种方法可以将此推得更远,覆盖排序 当然,但我希望尽可能简单

我还希望防止出现性能问题


有什么想法吗?

我发现DataGrid行定义有一个名为“get”的属性。 “get”指定返回要在DataGrid列中显示的值的函数的名称

理论上这应该解决我的问题

get函数的实现方式如下:

网格定义:

<table dojoType="dojox.grid.DataGrid">
  <thead>
    <tr>
      <th field="id">ID</th>
      <th field="contact" get="myGrid.getContactName">Name</th>
      <th field="contact" get="myGrid.getContactTel">Telephone</th>
      <th field="contact" get="myGrid.getContactBirthdateTime">Birthday</th>
    </tr>
  </thead>
</table>
我目前无法判断这一实施是否正确,因为 在我的应用程序中,item参数始终为null

这可能是因为使用了新的StoreAPI(Store.Memory)而不是ItemFileReadStore,但是我还没有成功地解决这个难题

此外,我无法使用这种新方法测试网格排序,因此我不会标记 这一解决方案尚未解决

更新

myGrid.getContactName = function(colIndex,record){
  if(record)return record.contact.name;
  else return null;
};
一旦我避免了无效的情况,它就这样很好地工作了

然而,网格的客户端似乎并没有通过get函数进行访问,而是直接使用字段。这会阻止对嵌套字段进行正确排序

更新

myGrid.getContactName = function(colIndex,record){
  if(record)return record.contact.name;
  else return null;
};
我终于找到了解决问题的办法:

第一个问题:为DataGrid字段指定嵌套数据已通过使用get函数深入数组子结构解决。(以上已解释)

但是,排序仍然取决于字段属性。 如果field属性包含数组的名称,则此列将无法正确排序

我不得不修改一些dojo类来适应这种情况。稍后,我将以一种更模块化的形式对此进行说明,但以下是目前的原始结果:

首先,我需要允许在网格定义中定义一个附加的比较器回调。 为此,我在dojox.grid.cells中添加了一些代码

dgc._Base.markupFactory = function(node, cellDef){
var d = dojo;
...
var comparator = d.trim(d.attr(node,"comparator")||"");
if(comparator){
  cellDef.comparator = dojo.getObject(comparator);
}
...
}
接下来,DataGrid需要为查询提供这个新参数来进行排序。 这是在dojox.grid.DataGrid中完成的。“c”是我在上面修改过的单元格

getSortProps:function(){
...
return[{attribute:c.field,descending:desc,comparator:c.comparator}];
}
最后,我需要更改dojo.store.util.SimpleQueryEngine中定义的排序本身。 SimpleQueryEngine是MemoryStore(dojo.store.Memory)的默认引擎

现在,我可以向每个列添加比较器,并在我希望的位置定义它们:

声明性数据网格设置:

...
<td field="myArray" get="getsNameFromArray" comparator="comparesNames">Name</td>
...
getter函数的Javascript定义(记录是整行并包含“myArray”对象):


临时结果将更改基本dojo类。一旦代码被清理成模块化使用,我将重写答案以提高可读性。
function execute(array){
    // execute the whole query, first we filter
    var results = dojo.filter(array, query);
    // next we sort
    if(options && options.sort){
        results.sort(function(a, b){
            for(var sort, i=0; sort = options.sort[i]; i++){
                var aValue = a[sort.attribute];
                var bValue = b[sort.attribute];
                if (aValue != bValue) {
                    // changed Part start
                    if(options.sort[i].comparator){ 
                        return !!sort.descending == options.sort[i].comparator(aValue,bValue) ? -1 : 1;
                    }
                    else{
                        return !!sort.descending == aValue > bValue ? -1 : 1;
                    }
                    // changed Part end
                }
            }
            return 0;
        });
    }
    ...
    return results;
}
...
<td field="myArray" get="getsNameFromArray" comparator="comparesNames">Name</td>
...
compareNames = function(a,b){
  return a.name > b.name;
}
getNamesFromArray= function(idx,record){
  return record.myArray.name;
}