1

たとえば、データセットを反復処理して 1 つのフィールドに値を設定するボタンがあります。

<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 行のデータセットがあり、実行時に顕著な遅延があります。

これを行う別の方法はありますか?

4

1 に答える 1

1

それを行うことをお勧めする方法は、次のアルゴリズムによるものです。

  • レコード テーブルにバインドされたデータセットで関連するイベントを無効にする
  • フィールドの更新で反復を行う
  • データセット イベントを再度有効にする
  • レコード テーブルを更新するイベントをトリガーする

更新を 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();
于 2012-10-26T02:59:47.783 に答える