我在这里创建了一个问题的例子:
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>
答案 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。