例如,我有一个按钮,它迭代数据集并将一个字段设置为一个值。
<button left="10" width="100" bottom="12" height="32" label="Select All" enabled-if-dataset="data">
<when event="onClick" xmlns="urn:aviarc:widget:com.aviarc.toronto.widget.core.action:1">
<dataset:dataset-iterator dataset="data">
<set-field field="data.selected" value="y"/>
</dataset:dataset-iterator>
</when>
</button>这在较小的数据集上工作得很好,但是现在我得到了一个包含400行的数据集,并且在运行时有一个明显的延迟。
有没有其他方法可以做到这一点?
发布于 2012-10-26 10:59:48
我推荐的方法是使用以下算法:
dataset events
的事件
我会将更新封装到Javascript操作小部件中。下面的摘录来自Aviarc3.6,我在那里做了类似的事情(从run方法),但你应该能够根据你的需要调整它:
/* disable all events on the target dataset which would most likely trigger some widget behaviours */
var dsEvents = [
"ONDATASETCHANGED"
,"ONDATACHANGED"
,"ONLOCALDATACHANGED"
,"ONCONTENTSREPLACED"
,"ONCURRENTROWCHANGED"
,"ONROWCREATED"
,"ONROWDELETED"
,"ONROWADDED"
,"ONCURRENTROWDELETED"
,"ONROWCOMMITACTIONCHANGED"
,"ONCURRENTROWCOMMITACTIONCHANGED"
,"ONROWFIELDCHANGED"
,"ONCURRENTROWFIELDCHANGED"
];
var events = toDS.getEvents();
for (var i = 0, count = dsEvents.length; i < count; i++) {
events.getEventByName(dsEvents[i]).disable();
}
toDS.deleteAllRows();
fromDS.getAllRows().doLoop(function(fromDSRow) {
if (doFiltering) {
if (fromDSRow.getField(userIDField) == userID) {
this._copyRow(fromDSRow, toDS.createRow());
}
} else {
this._copyRow(fromDSRow, toDS.createRow());
}
}, this);
toDS.reset();
/* enable all events back */
for (var i = 0, count = dsEvents.length; i < count; i++) {
events.getEventByName(dsEvents[i]).enable();
}
/* trigger refresh on the widgets as if we just updated ds via ajax */
toDS.onContentsReplaced.fireEvent();
toDS.onDataChanged.fireEvent();
toDS.onDatasetChanged.fireEvent();https://stackoverflow.com/questions/13079954
复制相似问题