如何将 dojo (dojo 0.x) FilteringTable 迁移到 (dojo 1.6) 中的 DataGrid?
我正在迁移和扩展基于非常旧的 Dojo 框架的现有 Web 应用程序。
表的声明式设置:
OLD
<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>
NEW
<table dojoType="dojox.grid.DataGrid" id="dataTable">
<thead><tr>
<th field="f_fname">Firstname</th>
<th field="f_lname">Lastname</th>
</tr></thead>
</table>
初始化表存储:
OLD
var tab = dojo.widget.byId("dataTable");
if(tab){
tab.store.setData([]);
}
NEW
var tab = dijit.byId("dataTable");
if(tab){
if(!tab.store){
tab.store = new dojo.store.Memory({data:[]});
}
else{
tab.store.setData([]);
}
}
刷新数据:
OLD/NEW
tab.store.setData(result.array);
旧版本表填充了数据,新版本表依然为空。 两种情况下检索的数据数组完全相同。
所以我想知道旧 FilteringTable 中使用的存储和新 dojox DataGrid 使用的存储 api 之间应该解决哪些差异。
由于我对使用数据存储不太熟悉,因此我可能会遗漏一些关键部分。
从视觉上看,新的网格似乎功能齐全。
更新
tab.update(); // tab = dojox.grid.DataGrid
不会使视觉部分保持最新状态。 当存储数据发生变化时,DataGrid 是否应该更新,或者是否需要执行一些手动操作?
事实上,DataGrid 似乎根本不对内存存储中的更改做出反应。也许这里缺少一些接线?
更新
我一直在以声明方式将网格与内存存储连接起来:
<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 是否可能不兼容所有商店? 我的印象是商店 api 在 1.6 中已经标准化。
如果是这样,是否有替代存储与 javascript 数组输入一起使用。 (如上所示)
Im migrating and extending an existing Web Application based on a very old Dojo Framework.
Declarative Setup of the table:
OLD
<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>
NEW
<table dojoType="dojox.grid.DataGrid" id="dataTable">
<thead><tr>
<th field="f_fname">Firstname</th>
<th field="f_lname">Lastname</th>
</tr></thead>
</table>
Initializing Table Store:
OLD
var tab = dojo.widget.byId("dataTable");
if(tab){
tab.store.setData([]);
}
NEW
var tab = dijit.byId("dataTable");
if(tab){
if(!tab.store){
tab.store = new dojo.store.Memory({data:[]});
}
else{
tab.store.setData([]);
}
}
Refreshing the Data:
OLD/NEW
tab.store.setData(result.array);
The old version Table is filled with the Data, the new version table remains empty.
The Data array retrieved in both cases is exactly the same.
So I wonder what differences should be adressed between the store used in the old FilteringTable and the store api used for the new dojox DataGrid.
Since I am new to using data stores in general I might be missing some crucial parts.
Visually the new Grid seems to be fully functual.
update
tab.update(); // tab = dojox.grid.DataGrid
does nothing to bring the visual part up to date.
Shouldn't the DataGrid update when the store data changes, or is there some manual action necessary?
In fact the DataGrid does not seem to react to changes in the Memory-Store at all. Maybe there is some wiring missing here?
update
I have been wiring up the Grid with a Memory store declaratively:
<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>
First thing that I get is an error in _setStore() in DataGrid.js saying:
this.store.getFeatures is not a function
.
Is it possible that DataGrid is not compatible with all stores?
I was of the impression that the store api was standardized in 1.6.
If so, is there an alternative Store to use with javascript array input.
(as seen above)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
其他论坛(Millennium)上的一张友善的海报为我提供了答案:
自 Dojo 1.6 以来,Dojo 中的商店有一个新的访问方案。
由于 dojox.grid.DataGrid 不直接支持这些存储,因此 dojo.data 中提供了一个名为 dojo.data.ObjectStore 的包装类。
因此,为了让我的内存存储正常工作,需要使用以下命令进行初始化:
并使用以下命令进行更新:
但是目前仍然存在一些缺点:
网格不会自动更新其数据,而是仅在对列进行排序后才更新。
使用 tab.update() 不起作用。
更新
当使用 objectStore.put() 或 objectStore.setData() 更改数据时,我现在使用 Grid 的 _refresh() 函数。
虽然它是一个私有函数,但我仍然没有更好的方法来更新网格。
A friendly poster on an other Forum (Millennium) has provided me with an answer:
Since Dojo 1.6 there is a new Access Scheme for stores in Dojo.
Since dojox.grid.DataGrid does not support those stores directly there is a wrapper Class provided in dojo.data called dojo.data.ObjectStore.
So in order to get my Memory Store to work it would need to be initialized with:
and updated with:
However there is still a little shortcoming at the moment:
The Grid does not update its data autmatically, but only after sorting a column.
Using tab.update() does not work.
update
When changing the data with objectStore.put() or objectStore.setData() I now use the _refresh() function of the Grid afterwards.
While it is a private function I still have no better way to update the Grid.