2011-12-15 66 views
1

我的json-store包含一條記錄。在更改字段後正確記錄此記錄,並且在store.sync()後正確地發送一個POST,其中包含action = update和正文中的記錄數據。在通過ext JS 4中的store.sync()更新記錄後,記錄翻了一番

在服務器端,我提交更新併發回最初發布的記錄(包含所有字段)(成功:true)。

之後,商店將記錄加倍,這意味着商店現在有兩(2)個相同的記錄(相同的ID等)。

我玩過所有可以想象的選項(root [on/off],idProperty(set/unset)等等),效果總是一樣的。

任何暗示我做錯了什麼?

回答

0

我終於找到了描述不當行爲的原因。在我的模型我已經覆蓋的構造是這樣的:

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

我真的不記得我爲什麼這樣做,但因爲我已刪除的構造,一切工作正常。但由於我的經驗不足,我不知道爲什麼這會起作用。

2

確保您的服務器返回一組記錄。如果只有一條記錄將其放入數組並將其發回。

看看這個demo與Firebug。

+1

這絕對不行。如果我同時更新兩條記錄,並將它們作爲數組發送回來,則兩者都在商店中複製。發送數組中的記錄不會改變任何內容。 - >另見我對其他答案的評論。 – heinob 2011-12-16 11:00:23

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 
     } 

編輯:我問這個問題前一陣子保費論壇和我得到的答案是,它應該工作,這裏是一個應該證明這一點的例子。 http://pastebin.com/z3gekQDn請注意模型中的id映射。

+0

這有效,但與所述不同......當我僅發回「{success:true}」時。一切工作正常,我不必清除髒標誌。它會自動完成。這個錯誤或功能? – heinob 2011-12-16 11:02:30