2013-03-14 54 views
2

我正在接收來自WCF服務的Json數據並想將其映射到我的viewModel。無法將JSON對象映射到ViewModel(敲除js)

JSON數據:

{"bios" : 
     { "Caption" : "something", 
      "Version": "something else", 
      .... 
     } 
    } 

HTML部分如下:

<ul class="biosContentUL"> 
       <li class="biosContentLI"> 
        <p> 
        <b>Caption: </b><span data-bind="text: bios.Caption"></span> 
        </p> 
       </li> 

       <li class="biosContentLI"> 
        <p> 
        <b>Version: </b><span data-bind="text: bios.Version"></span> 
        </p> 
       </li> 
       ....... 
</ul> 

視圖模型如下:

var viewModel = { 
    bios: ko.observable(), 
    cpu: ko.observable(), 
    ..... 
} 

$(document).ready(function() { 
    ko.applyBindings(viewModel); 
} 
); 

我想使用映射插件,但無法使其正常工作。

function showBios() { 
var response = $.ajax({ 
     type: "GET", 
     datatype: "json", 
     url: "...", 
     success: function (data) { 
      objJS= jQuery.parseJSON(data); 
      viewModel.bios(ko.mapping.fromJS(objJS)); 

      // I also tried this: 
      // ko.mapping.fromJS(objJS, {}, viewModel); 
     } 
     }); 

下面的代碼工作,但我也有observableArrays在我的ViewModel,所以我失去他們的內容,如果我叫applyBindings()一次。

viewModel.bios = ko.mapping.fromJS(objJS); 
ko.applyBindings(viewModel); 

如何將接收到的數據映射到我的viewModel屬性「bios」?對於頁面的每個部分都有多個視圖模型是不錯的方法,因此在每個模型中,我可以聲明簡單的屬性,而不是複雜的對象?

回答

1

我通常只喜歡在加載頁面時調用applybindings一次,但這意味着您需要在加載頁面時創建所有要綁定的觀察值。您可以爲bios創建子視圖模型,並且還要綁定您想要綁定的觀察對象,然後始終使用來自JSON方法的更新來填充它。

您是否嘗試過:

function biosViewModel() 
{ 
    var self = this; 
    self.Caption = ko.observable(); 
    self.Version = ko.observable(); 
} 

var viewModel = 
{ 
    bios: ko.observable(new biosViewModel()), 
    cpu: ko.observable() 
} 

然後,在你的成功方法:

ko.mapping.fromJSON(data, viewModel.bios()); 

更新和您從服務器返回的數據對象。

+0

在這種情況下,我需要一些布爾變量來表明它是否是第一次調用(並且每次都檢查它)。數據在啓動時不加載 - 只能通過用戶點擊加載。這是解決這個問題的好方法嗎? – 2013-03-14 15:40:14

+0

是的,或者你可以檢查是否(viewModel.bios()),如果它沒有值應該是false。 – 2013-03-14 15:41:56

+0

如果我理解正確,我需要在第一次使用後再次調用applyBindings()。但它可以清除observableArrays中包含的數據,不是嗎? – 2013-03-14 15:42:56