4

同期後もストアに残っているがデータベースに追加されていないフィールドを検出して削除しようとしています(成功:false)。次に、エラーメッセージをユーザーに返します(いくつかのエラーコードを含む)。ただし、ストアのドキュメントには「beforesync」イベントしか表示されません。

そのようなことをする可能性はありますか?「更新」イベントを試していますが、同期が成功した場合にのみ同期後に呼び出されます(それ以外の場合は、同期前にのみ呼び出されます)。

同期後に発生するイベントを実際に見つけることができません。これに対する解決策はありますか?

autoSyncを使用していることに注意してください。そのため、コールバックにフックできません。そうしないと、すべてが簡単になります。

ドキュメントで確認できるもう1つの重要なポイントは次のとおりです。

コード:

Ext.data.Model.EDIT
Ext.data.Model.REJECT
Ext.data.Model.COMMIT

REJECTイベントが発生しないのはなぜですか?success = false REJECTが呼び出される場合、その結果を取得するには404のようなものが必要だと思いましたか?

編集:いいえ、更新イベントの拒否バージョンを起動する方法が見つかりません。なにか提案を?

4

3 に答える 3

13

これは、私に言わせれば、ExtJSのいくつかの設計上の欠陥です。

AbstractStoreには、、、onCreateRecordsおよびonUpdateRecordsonDestroyRecordsあります。これらは、オーバーライドできる空の関数です。そこで成功がfalseの場合は、rejectChanges()を呼び出すことができます。

Ext.define('BS.store.Users', {
    extend: 'Ext.data.Store',    
    model: 'BS.model.User',

    autoSync: true,
    autoLoad: true,

    proxy: {
        type: 'direct',
        api: {
            create: Users.Create,
            read: Users.Get,
            update: Users.Update,
            destroy: Users.Delete,

        },
        reader: {
            type: 'json',
            root: 'data',
        },
    },

    onCreateRecords: function(records, operation, success) {
        console.log(records);
    },

    onUpdateRecords: function(records, operation, success) {
        console.log(records);
    },

    onDestroyRecords: function(records, operation, success) {
        console.log(records);
    },

});
于 2012-06-13T23:49:30.587 に答える
4

参考:レコードを更新するときの一連のイベント(ExtJs 5.0.1)

Scenerio 1
javascript executes 
record.set('some data')  // Store has autoSync: true, The database will succeed

'update' event fires (operation = 'edit')
'beforesync' event fires
network traffic occurs database returns a success (json)
'update' event fires (operation = 'commit') 
'onUpdateRecord' method runs

Scenerio 2
javascript executes
record.set('some data')  // Store has autoSync: true, The database will fail

'update' event fires (operation = 'edit')
'beforesync' event fires
network traffic occurs database returns a failure (json)
'onUpdateRecord' method runs and calls rejectChanges()
'update' event fires (operation = 'reject') 
'exception' event fires

2つの注意:a)最後の更新とonUpdateRecordが逆になり、b)onUpdateRecordがrejectChanges()を呼び出さない場合、次の「update」イベントは発生しません。これにより、レコードがダーティ状態のままになります。これは、後続のsync()がレコードを送信することを意味します。

record.add()の場合、イベントは似ていますが、「add」イベントが発生していないことがわかります。イベントのExtドキュメントには、イベントが発生すると記載されていますが、同じドキュメントには、add()メソッドがイベントを発生させるとは記載されていません。

于 2015-04-08T11:14:42.990 に答える
2

これを回避する別の方法は、ストアのメソッドsuspendAutoSyncとメソッドを使用してから手動で(Ext JS> 4.1.0):resumeAutoSyncsync

store.suspendAutoSync();
store.insert(0, record);
store.sync({
   success: function (batch, options) {
      // do something
   },
   failure: function (batch, options){
      // handle error
   }
});
store.resumeAutoSync();
于 2015-09-04T06:11:50.050 に答える