0

ExtJS 3.3 は古いプロジェクトであり、(残念ながら) 現時点ではアップグレードする時間がないため、このプロジェクトではまだ ExtJS 3.3 を使用しています。

安らかな JSON ストアを備えたエディター グリッド パネルがあります。JSON ストアは にautoSave設定されfalseています。これは、何かが変更されたときにサーバー上で長時間実行される可能性のあるタスクを実行する必要があるためです。そこで、「保存」ボタンを作成して、ユーザーが変更を完了したときにのみストアが保存されるようにすることにしました。ストアがサーバーに複数のリクエストを送信しているためsave、ストアのイベントをリッスンして、すべてのデータが保存された後に長時間実行される操作を開始する別のリクエストを起動しています。

ここで問題が発生します: ドキュメントによると、イベント ハンドラーの 3 番目のパラメーターは保存されたデータであり、次のようにストア操作 (作成、更新、または破棄) によってグループ化されます。

{
    create: [ /* created records here */ ],
    update: [ /* updated records here */ ],
    destroy: [ /* deleted records here */ ]
}

私の問題は、「作成された」レコードしか受信していないことです。他の操作では、いくつかのレコードが必要な場合、配列は常に空です。「update」または「destroy」を使用するレコードがない場合、dataオブジェクトには「update」または「destroy」キーが含まれていません (これは正しいことです)。

最後の保存操作で、更新されたレコードが 1 つ、作成されたレコードが 2 つあり、削除されていないレコードがあるとします。受け取るデータは次のようになります。

{
    create: [
        { /* record 1 data here */ },
        { /* record 2 data here */ }
    ],
    update: [] // <-- should not be empty!
}

理由がわからずupdatedestroy常に空です。誰でも私を助けることができますか?

または、作成/更新/削除されたすべてのレコードのIDを使用して「保存後」タスクを実行することで、元の問題を解決する方法について別の提案があるかもしれません。

4

1 に答える 1

0

私はこの問題を回避することができました。

どうやら、beforesaveイベントは正しいパラメーターを受け取ります。現在、ダーティ レコードをストアの一時プロパティに保存してから保存し、その後saveイベントでプロパティを読み取ります。

listeners: {
    beforesave: function (store, data) {
        // in my concrete case it's okay to join all records
        var all = (data.create || []).concat(data.update || []).concat(data.destroy || []);
        store.tempData = all;
    },

    save: function (store) {
        // do something with store.tempData
    }
}

のレコードtempDataは参照であるため、 が呼び出されたときにファントム レコード (サーバーによって生成された ID を持たない) であってもかまいませんbeforesave。がsave呼び出されると、これらのレコードは既に「実際の」レコードに置き換えられています。

于 2012-10-23T14:11:09.220 に答える