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>
4

2 回答 2

2

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

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

然后你会犯一些错误:

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

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

最后,要使表格可见,您可以说 items.length > 0。您想要的是 items().length > 0,它是底层数组的长度。

于 2012-03-29T09:48:29.660 回答
0

您的数组是self.items,但您的 ajaxsuccess调用正在更新self.items.address,我猜是undefined。所以映射插件正在创建一个模型,与原始模型无关。

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

当然我不是每次我的数据更改时都应用绑定吗?

正确的。你这样做一次,然后更新 observables 应该(一切都很好)更新 DOM。

于 2012-03-29T09:33:06.577 回答