2012-01-18 92 views
0

我写了一个简单的应用程序从服务器 C#代码 公共JsonResult阅读(){ VAR 产品= db.Products得到JSON数据; return Json(GetProducts(),JsonRequestBehavior.AllowGet); }knockoutJS JSON没有转换为可观察

public IEnumerable<Product> GetProducts() 
    { 
     var data = db.Products.ToList(); 
     return (data); 
    } 

在视图我写了下面结合图模型数据。

<div> 
<table data-bind="with: products"> 
    <thead><tr><th>From</th><th>To</th><th>Subject</th></tr></thead> 
    <tbody data-bind="foreach: Object"> 
     <tr> 
      <td data-bind="text: id"></td> 
      <td data-bind="text: name"></td> 
      <td data-bind="text: description"></td> 
     </tr>  
    </tbody> 
</table> 
</div> 
<script type="text/javascript"> 
    function ProductsViewModel() { 
     var self = this; 
     self.products = ko.observable(); 
     $.getJSON("http://localhost:50998/Home/Read", function (data) { 
      self.products = JSON.parse(data); 
     }); 

} 
    ko.applyBindings(new ProductsViewModel()); 
</script> 

从动作JSON数据返回是如下

[{"ID":1,"Name":"Roger","Description":"Test1"},{"ID":2,"Name":"Roger2","Description":"Test2"}] 

i之后具有解析JSON,我不能使用所解析的对象来更新observerable。

有谁知道为什么会发生这种情况?

回答

1

如果要将self.products(或任何其他可观察值的值)设置为JSON.parse的结果,则需要将其称为self.products(JSON.parse(data))。 Observable就像功能,所以你需要把它们当作函数来处理;-)

+0

感谢您的帮助,但是,即使我将代码更改为$ .getJSON(“http:// localhost:50998/Home/Read“,函数(data){self.products(JSON.parse(data)); });它仍然无法工作,是否有任何其他问题与我的代码。 – Roger 2012-01-18 20:19:27

+1

所以你想让你的JSON中的每个项目的每个属性都是ko.observable?如果是的话,我建议使用knockouts贴图插件http://knockoutjs.com/documentation/plugins-mapping.html这将为你做到这一点。 – 2012-01-18 20:24:23

+0

谢谢,我想要的是遵循knockoutjs学习中的同一个示例从odata获取所有电子邮件并绑定到列表,但是我写了一个操作返回JSON数据,因此我使用$ .getJSON获取数据,并且绑定到列表。在教程中,它不需要绑定每个项目的所有属性,只需获取数据并更新可观察文件夹,然后循环查看每封电子邮件。我会先尝试地图插件,看看它是否工作。 – Roger 2012-01-18 22:05:23

相关问题