2013-08-22 56 views
0

我最近升級到最新版本的Breezejs(從1.3.6到1.4.1)。 我有,我從服務器獲取實體的情況下,我也得到類似Breezejs新版本的合併實體功能

{ 
    "$type": "X.Y.Reference, X.Y", 
    "ReferenceTypeId": "BookEdited", 
    "ShouldDisplay": true, 
    "ShortTitle": "Informationsethik 1995", 
    "Title": "Informationsethik", 
    "Year": "1995", 
    "YearResolved": "1995", 
    "CloudProjectSubset": "ReferenceNavigation", 
    "Id": "34e1f0d1-eda7-4926-a13f-e75e43ff66b5", 
    "ProjectId": "syncproject1" 
    }, 

我希望你能注意到「ShouldDisplay」屬性設置爲true。 後來,由於我的應用程序的邏輯,我做的另一個查詢,我得到了別人之間,相同的實體,這個時候這樣的:

{ 
    "$type": "X.Y.Reference, X.Y", 
    "ReferenceTypeId": "BookEdited", 
    "ShortTitle": "Informationsethik 1995", 
    "Title": "Informationsethik", 
    "Year": "1995", 
    "YearResolved": "1995", 
    "CloudProjectSubset": "ReferenceNavigation", 
    "Id": "34e1f0d1-eda7-4926-a13f-e75e43ff66b5", 
    "ProjectId": "syncproject1" 
    }, 

通知我不再獲得屬性「ShouldDisplay」,這根據我的邏輯是正確的。 Breezejs在每次查詢後將實體合併到本地緩存中。關鍵是,在第二次查詢後使用版本1.3.6時,我仍然有我的實體'ShouldDisplay'設置爲true(這是我想要的),因爲第二個查詢返回沒有該屬性的同一個實體,然後不被覆蓋。然而,如果我使用版本1.4.1,則該屬性(即使未序列化)無論如何都會被覆蓋並設置爲null,這不是我想要的。 簡而言之,在我看來,在版本1.3.6中,只有返回的屬性被覆蓋,而不是1.4.1,所有屬性都被覆蓋。 在Breezejs的website或網絡上,我沒有找到關於這種「合併」行爲的信息,只是關於未決變化的合併策略的設置,這不是我目前所面臨的。有誰知道這是Breezejs應該工作的方式還是我缺少一些配置?謝謝。

+0

breeze的最新版本是1.4.9。這是你正在使用的? –

+0

是的。我昨天更新了它。直到1.3.6版本它工作正常(實際上我在我的答案中指出的代碼行沒有!==未定義的檢查),從1.4.1和未來的版本我有這個問題,我似乎昨天解決。仍然不知道這是一個功能還是一個錯誤。 –

回答

0

好的,在調試了Breeze的源代碼之後,我發現了它。如果他們想要檢查這是一個功能還是bug,我會發布我的解決方案,以防它對某人或Breeze人員有用。 我取代了這條線

return val !== undefined ? val : dp.defaultValue; 

這一行

return val; 

方法ctor.getRawValueFromServer和ctor.getRawValueFromClient內。重點是:當一個實體需要合併時,會觸發一個名爲updateEntity的方法,該方法遍歷目標實體屬性並檢查它們是否在從服務器獲取的原始實體中定義。如果原始實體上該屬性的值不是「未定義」,則方法將替換目標實體上的屬性。問題是,對於原始代碼行(如上所示),如果值爲'未定義',則返回該屬性的缺省值,在我的情況下爲'null',所以我的實體的所有屬性都是更換。現在它工作正常。我已經對Breezejs的最新版本(截至今天)進行了更正,該版本目前是1.4.9。 希望它可以幫助別人。