Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJS-更新数组时不更新表_Javascript_Jquery_Knockout 2.0 - Fatal编程技术网

Javascript KnockoutJS-更新数组时不更新表

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

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

我的实际代码连接到一个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>

国家
代码

您的数组是
self.items
,但是您的ajax
success
调用正在更新
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提供了更正的示例和示例,我已经用它来更正我的代码,它现在运行得很好!对于我在最初的问题中发布的糟糕的例子,我向所有人道歉,我将在将来尝试提交更清晰的样本。