使用Knockout.js从Json响应创建表

时间:2014-01-28 15:03:44

标签: javascript jquery json knockout.js

我正在尝试使用Json响应和Knockout.js

创建一个表

在Javascript中

$(document).ready(function() {

    $.ajax({
        method : "POST",
       url : "devTestServlet",
       success : function(data) {

           ko.applyBindings({ 
               rows : data
               });
       }
       });
});

在HTML中首先我在标题中导入了脚本:

   <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js"></script>  
    <script src="http://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
    <link rel="stylesheet" href="css/main.css" type="text/css"></link>
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>

然后我在身体里做了以下事情:

<table >
<tr>
<th>ID</th>
<th>Name</th>
<th>Start Date</th>
<th>Finish Date</th>
<th>Position</th>
</tr>
<tbody data-bind="foreach: rows">
<tr>
            <td data-bind="text: id"></td>
            <td data-bind="text: name"></td>
            <td data-bind="text: Start_Date"></td>
            <td data-bind="text: Finish_Date"></td>
            <td data-bind="text: Position"></td>
</tr>
</table>

数据格式如下:

[
        {
            "id": "1",
            "name": "Mike",
            "Start_Date": "Sun 01/06/08",
            "Finish_Date": "Sun 01/06/08",
            "Position": "Trainee"

        },
        {
            "id": "2",
            "name": "Jhon",
            "Start_Date": "Sun 01/06/08",
            "Finish_Date": "Sun 01/06/08",
            "Position": "Trainee"
        },
        {
            "id": "2",
            "name": "Jhon",
            "Start_Date": "Sun 01/06/08",
            "Finish_Date": "Sun 01/06/08",
            "Position": "Trainee"
        }
] 

这是我的第一个使用Knockout.js的程序,所以可能是我遗漏了一些东西。你能建议吗?

4 个答案:

答案 0 :(得分:3)

$.ajax默认情况下将响应作为字符串返回,knockout需要一个JavaScript对象。因此,您必须将dataType指定为JSON

$.ajax({
   method: "POST",
   url: "devTestServlet",
   dataType: 'json', 
   success: function(data) {
       ko.applyBindings({ 
           rows : data
       });
   }
});

或自己进行转换

$.ajax({
   method: "POST",
   url: "devTestServlet",
   success: function(data) {
       ko.applyBindings({ 
           rows : JSON.parse(data)
       });
   }
});

答案 1 :(得分:0)

  1. 将jQuery放在你的库中的Knockout JS之前。

  2. 确保rowsko.observableArray();

  3. ko.applyBindings({ rows : data });更改为:rows(data);

答案 2 :(得分:0)

你做错了。

您应该添加绑定并更新它们。 看起来应该是这样的:

var HomeModel = function() {
    this.rows = ko.observableArray([]);
};

$(document).ready(function() {
    var model = new HomeModel();
    ko.applyBindings(model);

    $.ajax({
        method : "POST",
       url : "devTestServlet",
       success : function(data) {
           for (var x in data) {
               model.rows.push(data[x]);
           }
       }
       });
});

由于'rows'现在是'observableArray',它将更新你的HTML agains更改。 古德勒克!

答案 3 :(得分:0)

  1. jQuery引用应该在knockout.js
  2. 之前
  3. 除此之外,您的代码很好并且对我个人有用:http://jsfiddle.net/ruslans/eybZ6/
  4. 我建议将样式表引用放在页面底部的脚本引用位置:

    <head>
        <link rel="stylesheet" href="css/main.css" type="text/css"></link>
    </head>
    <body>
        <content />
        <script src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js"></script>  
        <script src="http://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
    </body>