0

如何使用新插件(使用映射插件創建)替換視圖模型內的整個對象(使用映射插件創建)?請注意我在視圖模型中的評論...替換使用新映射插件創建的挖空視圖模型

function viewmodel(objServerModel) { 
      var self = this; 
      self.profile = objServerModel; //Using ko.observable(objServerModel) doesn't seem to work. I need to replace this object every time I load new content from the server and it should automatically update all controls bound to it. Note that this is the object that is created using ko.mapping.fromJS 
      self.devices = ko.observableArray(['one', 'two']); 

      }); 

下面的函數只調用一次。從下一次開始,當我從服務器獲取新數據時,我只需要替換self.profile。 如果我使用self.profile = ko.observable(objServerModel),它不起作用。每當我從服務器異步加載新數據時,如何替換viewmodel中的配置文件對象?

function ApplyKnockOut() { 

      var objServerModel = '@Html.Raw(HttpUtility.JavaScriptStringEncode(clsTest.ReadXmlIntoModel()))' 

       var objResult = $.parseJSON(objServerModel); 
       var objModelFromServer = ko.mapping.fromJS(objResult); 

       var clientViewModel = new viewmodel(objModelFromServer); 

       ko.applyBindings(clientViewModel); 
       return clientViewModel; 

      } 

我將不勝感激任何幫助。

謝謝

編輯:被替換的映射模型結構將是相同的。只有值會有所不同。

這裏是我的jsfiddle:http://jsfiddle.net/rzFgU/

+0

這是通過設計,它只更新已更改的字段,以便只更新綁定。 – Anders

回答

1

柯測繪工作原理是這樣的設計,因爲它不希望完全渲染視圖,而是隻更新已更改的綁定。如果你真的想讓它變成新的對象引用,你可以做這樣的事情。請注意,由於我們現在更改對象引用而不是更新同一對象上的觀察對象,因此持有對象的成員是可觀察對象是很重要的。

http://jsfiddle.net/N56FR/

ViewModel = function(data) { 
    this.complex = ko.observable(); //Important 
    this.map(data); 
}; 

ViewModel.prototype = { 
    map: function(data) { 
     var mapping = { 
      complex: { 
       update: function(options) { 
        return ko.mapping.fromJS(options.data); 
       } 
      } 
     }; 
     ko.mapping.fromJS(data, mapping, this); 
    } 
}; 

編輯:有從下面的一些問題與提琴的意見jsfiddle.net/rzFgU

我會在這裏一一列舉了

  • 你的說法那observable不會工作(它在小提琴代碼中的評論),那是因爲你做的objectcreatedusingmapping.firstName,你不能訪問像這樣的觀察物上的財產。在輸入元素周圍使用with綁定,然後直接訪問firstName。或者做objectcreatedusingmapping()。firstName。第一個解決方案更清潔
  • ReplaceModel haning失敗,所以你不能做data-bind =「click:ReplaceModel」或者將函數移動到模型中,或者執行data-bind =「click:window.ReplaceModel」。第一種解決方案更清潔
  • 您甚至沒有使用您的PersonViewModel,您正在創建一個,然後將其作爲參數發送給fromJS函數,這意味着它將被替換爲動態創建的對象。
+0

這對我來說看起來很複雜。 Viewmodel內部複雜的內部映射。你能不能在這個小提琴上更新它:http://jsfiddle.net/rzFgU/? – Josh

+0

該代碼中存在大量錯誤 – Anders

+0

請參閱編輯... – Anders

相關問題