それを行うことをお勧めする方法は、次のアルゴリズムによるものです。
- レコード テーブルにバインドされたデータセットで関連するイベントを無効にする
- フィールドの更新で反復を行う
- データセット イベントを再度有効にする
- レコード テーブルを更新するイベントをトリガーする
更新を Javascript アクション ウィジェットにラップします。以下の抽出は、( run メソッドから) 同様のことを行っていた Aviarc 3.6 からのものですが、必要に応じて調整できるはずです。
/* 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();