0

我有这个 jQuery:

$.ajax({url : sUrl,
    dataType: "jsonp",
    type: "GET",
    contentType: "application/json;charset=utf-8",
    headers: { "accept": "application/json;charset=utf-8" },
    error: function (a, b, c){
        alert(a);
        alert(a.status);
        alert(b);
        alert(c);
    },
    success: function (data) {
        alert(data);
        var viewModel = ko.mapping.fromJS(data);
        alert(viewModel);

        /*$.each(data, function (index, element) { 
            alert(index);
            alert(element);
        });*/
    }
});

alert(data);了我这个:

在此处输入图像描述 第二个警报给了我:

function c(){if(0<arguments.length)return c.equalityComparer&&c.equalityComparer(d,arguments[0])||(c.K(),d=arguments[0],c.J()),this;a.q.bb(c);return d}

运行直到索引 > 100,因此.each返回了一个行集。

这是我的 JSON 的一小部分(当我从以下位置手动点击 url 时var sUrl

([{    "0":"C551003",
       "id":"57024",
       "1":"0373",
       "number":"373-NIK",
       "2":"1349078013",
       "date_time":"1349078192",
       // etc.
 },{ // next item

我只是不知道将这个 JSON 解析为一个漂亮的表的最佳方法是什么。我认为它会给我一个视图模型中的行数组,我可以做这样的事情:http: //knockoutjs.com/documentation/foreach-binding.html 但我不知道映射是否有效以及我是如何工作的可以绑定到例如number道具。

<tbody data-bind="foreach: iHaveNoClue">
    <tr>
        <td data-bind="text: 0"></td>
        <td data-bind="text: id"></td>
        <td data-bind="text: 1"></td>
        <td data-bind="text: number"></td>
        <td data-bind="text: 2"></td>
        <td data-bind="text: date_time"></td>
    </tr>
</tbody>
4

1 回答 1

2

预先注意:因为您有名称是数字的属性,所以您必须跳过一些环节才能让textbindingHandler 工作。一种方法是替换text: 1text: $data['1'].


你在正确的轨道上。iHaveNoClue可以用 , 代替,例如$root

<tbody data-bind="foreach: $root">

有关示例,请参见此小提琴。这是可行的,因为 viewModel 本身将由observableArrayko.mapping 插件制成。


替代解决方案
或者,您可以创建一个视图模型,该模型仅包含一个 items 可观察数组,其中包含您通过 AJAX 请求获得的内容。您的视图模型可以这样构造:

var viewModel = {
    title: ko.observable("My title"),
    items: ko.mapping.fromJS(data)
};

有关该版本的演示,请参见this fiddle。在本例中,viewModel 是一个简单的对象,但您也可以创建一个构造函数来构建更复杂的视图模型。

于 2013-08-07T12:58:04.813 回答