2013-07-26 86 views
0

我有一個簡單的微風/淘汰賽的SPA。我必須爲一個實體列表實現一個「單一保存」選項 - 編輯將在列表中完成,而不是在單獨的彈出窗口中完成。微風客戶端實體不更新後,服務器端更改

保存服務器將檢查只有實體的某些attrs被更新,並更新「最後更新日期」attr。

實體列表被一個實體管理器從服務器拉出。

啓用單個保存更新並準備保存的實體從主實體管理器導出並導入臨時實體管理器。執行保存並(如果可以)將對象重新導出並導回到主實體管理器中。

function saveSingle(entity) 
{ 
    var tempMgr = MainEntityManager.createEmptyCopy(); 
    var exp = MainEntityManager.exportEntities([entity]); 
    tempMgr.importEntities(exp, { 
     mergeStrategy: breeze.MergeStrategy.PreserveChanges }); 
    tempMgr.saveChanges() 
    .then(function (saveResult) { 
     var reImp = tempMgr.exportEntities(); 
     MainEntityManager.importEntities(reImp); 

     entity.Last_Updated_Date(saveResult.entities[0].Last_Updated_Date()); 
     entity.entityAspect.entityState = breeze.EntityState.Unchanged; 

     logger.success("changes saved"); 
    }) 
    .fail(function() { 
     logger.error("Single Save failed: " + error.message); 
    }); 
} 

但是,它看起來像新的「最後更新日期」的價值沒有得到後的再出口/進口保存回MainEntityManager過程中複製過來。我已經解決了這個問題,但是我想知道在這個實現中是否做了錯誤的事情,以及是否有更好的方法來構造「單一實體保存」功能?

評論和問題歡迎!

回答

0

我還沒有用多個EntityManagers構建Breeze應用程序,但我已閱讀關於該主題的文檔(它看起來像你也有,但如果你沒有:http://www.breezejs.com/documentation/multiple-managers)。順便說一下,看看你的代碼,我不認爲你正在做他們在文檔中描述的內容。也許這是故意的,但我想我會指出。他們建議你做的就是讓用戶對從「沙盒」EntityManager解析出的實體進行本地編輯,然後以某種方式(或者通過導入,就像你在做的那樣)將變化複製回主EntityManager。

無論如何,我不認爲Breeze在保存時總是從服務器發回實體的副本。
下面是EntityManager的source評論:

//注意visitAndMerge操作進行了優化,使我們實際上並不執行合併如果 //保存操作實際上並沒有返回實體 - 即在OData和Mongo更新和刪除期間。

要確認服務器是否正在從服務器發回你的實體的副本,運行Fiddler(這是所有Web開發的寶貴工具),這樣就可以看到什麼會回來的響應。如果你問的話,Fiddler甚至會爲你打印一個JSON響應。 :-)

相關問題