2013-03-14 118 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