KnockoutJS - 更新数组时表不更新

时间:2012-03-29 09:06:20

标签: javascript jquery knockout-2.0

我在这里创建了一个问题的例子:

http://jsfiddle.net/JustinN/qWeLT/1/

我的实际代码与ASP.NET Web方法相关联,因此示例代码已经过调整,指向公共Web服务进行演示。

基本上,我有一个绑定到的数组,但是在ajax调用之后,表没有显示更新的信息。我不确定我缺少什么,我起初认为我需要映射插件,所以我已经尝试了但仍然没有到达任何地方。

当我的数据发生变化时,我当然不打算申请绑定吗?

[编辑]

下面的JavaScript:

var ViewModel = function () {
var self = this;
self.items = ko.observableArray([]);
self.refresh = function () {
    $.ajax({
        type: "POST",
        url: "http://api.wipmania.com/json",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            ko.mapping.fromJS(data.d, self.items.address);
        }
    });
};
}

var viewModel = new ViewModel();
$(function () {
ko.applyBindings(viewModel);
viewModel.refresh();
});

下面的HTML:

<table data-bind="visible:items.length > 0">
<thead>
    <tr>
        <th>Country</th>
        <th>Code</th>
    </tr>
</thead>
<tbody data-bind="foreach: items">
    <tr>
        <td data-bind="text:country"></td>
        <td data-bind="text:country_code"></td>
    </tr>
</tbody>
</table>

2 个答案:

答案 0 :(得分:2)

看看这个小提琴:http://jsfiddle.net/Gm7zH/1/

首先,由于跨域请求,我使用假的ajax数据。这是我从你的服务器获得的数据。并使用setTimeout来模拟异步请求。

然后你会犯很多错误:

您尝试映射到不存在的数组的属性地址。其次,结果的地址只是一个对象,所以我将它包装在一个数组中以使其工作。

然后你尝试映射到现有的observableArray,但是提供数组作为第二个参数,第二个参数是映射选项,第三个参数是正确的位置。我将null作为示例中的映射选项传递。

最后,要使表格可见,请说items.length&gt;你想要的是物品()。长度&gt; 0是底层数组的长度。

答案 1 :(得分:0)

您的数组是self.items,但您的ajax success来电正在更新self.items.address,我猜是undefined。因此,映射插件正在创建一个与原始模型无关的 new 模型。

(你没有展示data.d的样子,但我假设它是一个数组。)

  

当我的数据发生变化时,我当然不打算申请绑定吗?

正确。你做了一次,然后更新observable应该(一切都很好)更新DOM。