我在这里创建了一个问题示例:
http://jsfiddle.net/JustinN/qWeLT/1/
我的实际代码已连接到 ASP.NET Web 方法,因此示例代码已调整为指向公共(public) Web 服务进行演示。
基本上,我有一个绑定(bind)到的数组,但是在 ajax 调用之后,该表不显示更新的信息。我不确定我错过了什么,我一开始以为我需要映射插件,所以我尝试过,但仍然一无所获。
我肯定不打算在每次数据更改时都应用Bindings 吗?
[编辑]
下面的 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>
最佳答案
看看这个 fiddle :http://jsfiddle.net/Gm7zH/1/
首先,由于跨域请求,我使用了假的ajax数据。这是我从你们服务器得到的数据。并使用setTimeout来模拟异步请求。
然后你犯了一些错误:
您尝试映射到数组的属性地址,但该地址不存在。其次,结果的地址只是一个对象,因此我将其包装在一个数组中以使其正常工作。
然后,您尝试映射到现有的 observableArray,但提供该数组作为第二个参数,第二个参数是映射选项,第三个参数是正确的位置。我在示例中将 null 作为映射选项传递。
最后,为了使表格可见,你可以说 items.length > 0。你想要的是 items().length > 0,这是底层数组的长度。
关于javascript - KnockoutJS - 更新数组时表不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922259/