1

我正在迁移和扩展基于非常旧的 Dojo 框架的现有 Web 应用程序。

表的声明性设置:

老的

<table dojoType="FilteringTable" id="dataTable" 
valueField="f_id" multiple="false" alternateRows="true">
  <thead><tr>
    <th field="f_fname">Firstname</th>
    <th field="f_lname">Lastname</th>
  </tr></thead>
</table>

新的

<table dojoType="dojox.grid.DataGrid" id="dataTable">
  <thead><tr>
    <th field="f_fname">Firstname</th>
    <th field="f_lname">Lastname</th>
  </tr></thead>
</table>

初始化表格存储:

老的

var tab = dojo.widget.byId("dataTable");
if(tab){
  tab.store.setData([]);
}

新的

var tab = dijit.byId("dataTable");
if(tab){
  if(!tab.store){
    tab.store = new dojo.store.Memory({data:[]});
  }
  else{
    tab.store.setData([]);
  }
}

刷新数据:

老新

tab.store.setData(result.array);

旧版本表填满了数据,新版本表保持空白。两种情况下检索到的 Data 数组完全相同。

所以我想知道旧 FilteringTable 中使用的 store 和新 dojox DataGrid 中使用的 store api 之间应该解决哪些差异。

由于我通常不熟悉使用数据存储,因此我可能会遗漏一些关键部分。

从视觉上看,新的 Grid 似乎功能齐全。

更新

tab.update(); // tab = dojox.grid.DataGrid

没有使视觉部分保持最新。存储数据更改时 DataGrid 不应该更新,还是需要一些手动操作?

事实上,DataGrid 似乎根本不会对 Memory-Store 中的更改做出反应。也许这里缺少一些接线?

更新

我一直在以声明方式使用内存存储连接网格:

<div dojoType="dojo.store.Memory" jsId="memStore"></div>
<table dojoType="dojox.grid.DataGrid" id="dataTable" store="memStore">
  <thead><tr>
    <th field="f_fname">Firstname</th>
    <th field="f_lname">Lastname</th>
  </tr></thead>
</table>

我得到的第一件事是 DataGrid.js 中的 _setStore() 错误说:

this.store.getFeatures is not a function

. DataGrid 是否可能与所有商店不兼容?我的印象是 store api 是在 1.6 中标准化的。

如果是这样,是否有替代商店可与 javascript 数组输入一起使用。(如上所示)

4

1 回答 1

4

另一个论坛(千年)上的友好海报为我提供了答案:

从 Dojo 1.6 开始,Dojo 中的商店有了新的访问方案。

由于 dojox.grid.DataGrid 不直接支持这些存储,因此在 dojo.data 中提供了一个名为 dojo.data.ObjectStore 的包装类。

因此,为了让我的内存存储正常工作,需要使用以下命令对其进行初始化:

var tab = dijit.byId("dataTable");
if(tab){
  if(!tab.store || !tab.store.objectStore){
    tab.store = new dojo.data.ObjectStore({
                    objectStore : new dojo.store.Memory({data:[]})
                });
  }
  else{
    tab.store.objectStore.setData([]);
  }
}

并更新为:

tab.store.objectStore.setData(result.array);

但是目前还有一个小缺点:Grid 不会自动更新数据,只能在对列进行排序后更新。使用 tab.update() 不起作用。

更新

当使用 objectStore.put() 或 objectStore.setData() 更改数据时,我现在使用 Grid 的 _refresh() 函数。虽然它是一个私有函数,但我仍然没有更好的方法来更新网格。

于 2011-05-04T12:49:07.837 回答