2012-07-03 107 views
1

我在.NET定義以下模型:結果JS變化子實體跟蹤

Public Class Request 
    <Key()> 
    Public Property RequestId As String 
    Public Property Description As String 
    Public Property InfoCards As List(Of InfoCard) 
End Class 

Public Class InfoCard 
    <Key()> 
    Public Property InfocardId As String 
    Public Property Description As String 
    Public Property RequestId As String 
End Class 

ReqeuestId上的InfoCard屬性,使EF代碼第一次可以產生分貝。 然後我用UpshotContext幫手產生像這樣的JavaScript型號:

Html.UpshotContext(bufferChanges:= true) _ 
    .DataSource(Of UpshotTest.UpshotTest.RequestController)(Function(x) x.GetRequests()) _ 
    .ClientMapping(Of UpshotTest.Models.Request)("Request") _ 
    .ClientMapping(Of UpshotTest.Models.InfoCard)("InfoCard") 

這將生成所有車型很好,當我打電話refresh對結果數據源,如預期的數據檢索。

問題我面臨的是當我試圖修改一個子對象的屬性(例如Request.InfoCards(0).Description)。更改該值將觸發InfoCard中的更改,但不會觸發Request實體中的更改。因此,呼籲Request.IsUpdated()將返回,同時呼籲Request.InfoCards(0).IsUpdated()將返回真正

結果不知道如何跟蹤子實體的變化?或者它是客戶端映射的問題? 到目前爲止,我已經嘗試了幾種映射:

  • 手動映射所有屬性:

    window.Request = function (initialData) { 
        var self = this; 
        self.RequestId = ko.observable(initialData.RequestId); 
        self.Description = ko.observable(initialData.Description); 
        self.InfoCards = ko.observableArray(ko.utils.arrayMap(initialData.InfoCards, function (data) { 
         return new window.InfoCard(data); 
        })); 
    
        upshot.addEntityProperties(self, "Request:#UpshotTest.Models"); 
    }; 
    
  • 使用upshot.map

    window.Request = function (initialData) { 
        var self = this; 
        upshot.map(initialData, upshot.type(Request), self); 
    }; 
    
  • 定義我自己地圖功能和傳遞結局:

    window.Request = function (initialData) { 
        var self = this; 
        upshot.observability.configuration.map(initialData, upshot.type(Request), map, self); 
    }; 
    

的映射似乎正確的所有方法,除父實體不知道在孩子做了修改。兒童跟蹤甚至可能嗎?

回答

4

好的,我最終發現了這個問題。事實證明,這種行爲是可重複的,當3個嵌套實體的分級存在(即請求 - >信息卡 - > InfoField修改InfoField的值在父實體中沒有體現

後。結果調試的幾個小時,我發現罪魁禍首是在_addTrackingRecursive方法upshot.js。更換obs.track(obj, this._getTracker(), this._entityType);調用obs.track(obj, this._getTracker(), type);解決嵌套的變化跟蹤問題。