2011-12-15 5 views
1

My json-storeにはレコードが1つあります。このレコードは、フィールドを変更した後に汚れていますが、store.Sync()の後にPOSTがaction = updateで送信され、本体のレコードデータが正しく送信されます。Ext JS 4のstore.sync()を使用してレコードを更新した後、レコードは2倍になります。

サーバー側では、更新をコミットし、元の状態(すべてのフィールドが含まれています)としてレコードを(成功と真:true)戻します。

その後、ストアはレコードを2倍にしました。つまり、ストアには2つの同一のレコード(同じIDなど)があります。

私は想像することのできるすべてのオプション(root [on/off]、idProperty(set/unset)など)を使って遊びましたが、その効果は常に同じです。

私が間違っていることは何ですか?

答えて

0

最後に、説明した誤動作の理由が見つかりました。私はこれをしなかった理由を、私は本当に覚えていないが、私は、コンストラクタを削除しておりますので、すべてが正常に動作し

constructor: function(config) { 
    this.callParent([config]); 
}, 

:私のモデルの中で私はこのようなコンストラクタを上書きしていました。しかし、私の相対的な経験不足のために、私はなぜこれが機能するのか分かりません。

2

サーバーがレコードの配列を返すことを確認します。レコードが1つだけの場合は配列に入れて送り返します。

Firebugでdemoをチェックしてください。

+1

これは間違いなく動作しません。私が2つのレコードを同時に更新し、それらをアレイとして返送すると、両方がストアに複製されます。配列内のレコードを送信しても何も変わりません。 - >他の答えについての私のコメントも見てください。 – heinob

3

私は同じ問題を抱えていました。私の理論は、返されたレコードのIDマッチングが適切に行われていないということです。私の考えでは、idProperty型は文字列やそのような災害の代わりにintでなければなりません。私はこれを証明することはできませんでしたが、私は回避策があります。ここで私はこの問題をどのように「扱ったか」です:

1)。データを返信しないで、成功メッセージを送信してください。
2)。次のストアリスナーで手動ダーティフラグをクリアします。

listeners : { 
      write: function(store, operation, opts){ 
       console.log('request wrote!'); 
       //workaround to sync up store records with just completed operation 
       Ext.each(operation.records, function(record){ 
        if (record.dirty) { 
         record.commit(); 
        } 
        /*if (record.phantom) { 
         record.phantom=false; 
        }*/ 
       }); 
       store.load(); 
      }, 
      delay: 2000 
     } 

EDIT:私はプレミアムフォーラムでしばらく前にこの質問をしたし、私が得た答えは、それが動作するようになっていますということで、ここにありますそれを証明するはずの例。 http://pastebin.com/z3gekQDnモデル内のIDマッピングに注意してください。

+0

これはうまく動作しますが、説明どおりに違います... "{success:true}"だけを返信します。すべてうまく動作し、私は汚れた旗をクリアする必要はありません。それは自動的に行われます。このバグや機能はありますか? – heinob

+1

ExtJSには本当にちょうど "機能"であるたくさんのバグがあります。=/ –

+0

私の答えは、おそらく動作する例があります。 – dbrin

関連する問題