Javascript KnockoutJS-更新数组时不更新表
我在这里创建了一个问题示例: 我的实际代码连接到一个ASP.NET web方法,因此示例代码经过调整,指向一个公共web服务进行演示 基本上,我有一个绑定到的数组,但是在ajax调用之后,表不会显示更新的信息。我不确定我遗漏了什么,起初我认为我需要映射插件,所以我试过了,但仍然没有成功 当然,我不打算在每次数据更改时应用绑定吗 [编辑] JavaScript如下:Javascript KnockoutJS-更新数组时不更新表,javascript,jquery,knockout-2.0,Javascript,Jquery,Knockout 2.0,我在这里创建了一个问题示例: 我的实际代码连接到一个ASP.NET web方法,因此示例代码经过调整,指向一个公共web服务进行演示 基本上,我有一个绑定到的数组,但是在ajax调用之后,表不会显示更新的信息。我不确定我遗漏了什么,起初我认为我需要映射插件,所以我试过了,但仍然没有成功 当然,我不打算在每次数据更改时应用绑定吗 [编辑] JavaScript如下: var ViewModel = function () { var self = this; self.items = ko.ob
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>
国家
代码
您的数组是self.items
,但是您的ajaxsuccess
调用正在更新self.items.address
,我猜它是未定义的。因此,映射插件正在创建一个与原始模型无关的新模型
(您尚未显示data.d
的外观,但我假设它是一个数组。)
当然,我不打算在每次数据更改时应用绑定吗
对。您只需这样做一次,然后更新可观察对象就应该(一切正常)更新DOM。查看此提琴:
首先,由于跨域请求,我使用的是假的ajax数据。这是我从你的服务器上得到的数据。并使用setTimeout来模拟异步请求
然后,您将执行一些错误:
您试图映射到数组的属性地址,该地址不存在。其次,结果的地址只是一个对象,所以我将其包装在一个数组中以使其工作
然后尝试映射到现有的ObservalArray,但将数组作为第二个参数提供,第二个参数是映射选项,第三个是正确的位置。在我的示例中,我将null作为映射选项传递
最后,要使表可见,可以说items.length>0。您需要的是items().length>0,它是底层数组的长度。对此感到抱歉,我过去常常粘贴代码,但后来一直有人问我JSFIDLE的示例。我现在把两者都包括进去已编辑并已修复。此行中有。地址
的原因是什么<代码>ko.mapping.fromJS(data.d,self.items.address)代码>好交易。是的,复制和粘贴是最好的(令人惊讶的是人们重新键入的频率——然后引入不相关的错误!),而作为附件的实时链接(我更喜欢,但这是一个品味问题)也很棒。data.d
看起来像什么?(您可以从使用的任何调试器的“网络”选项卡中获取它,并通过格式化它,如果您愿意的话,可以省去手工操作。)这可能会有所帮助:-我希望我可以提供一个公共web服务来演示这个问题,而不必依赖JSFIDLE中的模拟,和显示其他问题。它看起来像我的例子,我突然提出,以证明我的问题有许多问题,它自己的。.address应该在data.d.address上,而不是在self.items上-对于混淆表示歉意,但是不幸的是问题不在那里。感谢Martin提供了更正的示例和示例,我已经用它来更正我的代码,它现在运行得很好!对于我在最初的问题中发布的糟糕的例子,我向所有人道歉,我将在将来尝试提交更清晰的样本。