Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 更改数组时不更新淘汰JS_Javascript_Knockout.js - Fatal编程技术网

Javascript 更改数组时不更新淘汰JS

Javascript 更改数组时不更新淘汰JS,javascript,knockout.js,Javascript,Knockout.js,我知道这个问题已经被问了好几次了,但都没有回答我的问题。 我有以下资料: 我将JSON到Javascript的数据转换成二维数组。 当我加载该站点时,该表显示为所需。 现在,当我单击一个按钮(仅用于测试)时,它正在更新数组中的一个值,并将该数组记录在控制台中,在控制台中可以看到更改后的数组。 问题是更改没有显示在表中。 当我向数组中添加一个值时,它会显示在表中。 我做错了什么 HTML: 添加 JS: var排序=ko.observearray([]); $(函数(){ var reques

我知道这个问题已经被问了好几次了,但都没有回答我的问题。 我有以下资料: 我将JSON到Javascript的数据转换成二维数组。 当我加载该站点时,该表显示为所需。 现在,当我单击一个按钮(仅用于测试)时,它正在更新数组中的一个值,并将该数组记录在控制台中,在控制台中可以看到更改后的数组。 问题是更改没有显示在表中。 当我向数组中添加一个值时,它会显示在表中。 我做错了什么

HTML:


添加
JS:

var排序=ko.observearray([]);
$(函数(){
var request=new XMLHttpRequest();
var formData=new formData();
var响应元素=[];
open(“POST”,“scripts.php”,true);
formData.append(“action”、“getSorts”);
request.onreadystatechange=函数(){
if(request.readyState==4&&request.status==200){
responseElements=JSON.parse(request.responseText);
排序=转换列表(响应元素);
应用绑定(新的应用视图模型(排序));
}
}
请求。发送(formData);
});
函数convertList(response){//只是将json对象转换为更有用数组的函数
变量名称=[];
var成分=[];
var排序=[];
对于(var指数=0;指数

谢谢。

可观察数组只监视添加到其中的项目,而不是项目本身,因此

self.sorts.push({name: "qwer", ingName: "we"});  //works like expected
之所以有效,是因为您要将可观察数组添加到它的项中,但是

self.sorts[0]["name"] = "test";  //doesn't update table
无法工作,因为可观察数组无法知道其中的项已更改。要使其工作,数组中项目的属性需要是可观察的

在转换列表中切换到:

for (var i = 0; i < names.length; i++) {
    sorts[i] = {};
    sorts[i]['name'] = ko.observable(names[i]);
    sorts[i]['ingName'] = ko.observable(ingredients[i]);
}
另外,你似乎还有其他一些问题。在第一行将排序定义为一个可观察数组,但使用convertList的返回值覆盖它,它是一个普通数组,而不是一个可观察数组

sorts = convertList(responseElements);
ko.applyBindings(new AppViewModel(sorts));
我将删除第一行,并将排序创建为可观察数组

function convertList(response) {  //just the function to convert the json object to a more useful array
    var names = [];
    var ingredients = [];
    var sorts = ko.observableArray([]);
    ...

可观察数组只监视添加到其中的项目,而不监视项目本身,因此

self.sorts.push({name: "qwer", ingName: "we"});  //works like expected
之所以有效,是因为您要将可观察数组添加到它的项中,但是

self.sorts[0]["name"] = "test";  //doesn't update table
无法工作,因为可观察数组无法知道其中的项已更改。要使其工作,数组中项目的属性需要是可观察的

在转换列表中切换到:

for (var i = 0; i < names.length; i++) {
    sorts[i] = {};
    sorts[i]['name'] = ko.observable(names[i]);
    sorts[i]['ingName'] = ko.observable(ingredients[i]);
}
另外,你似乎还有其他的问题。在第一行将排序定义为一个可观察数组,但使用convertList的返回值覆盖它,它是一个普通数组,而不是一个可观察数组

sorts = convertList(responseElements);
ko.applyBindings(new AppViewModel(sorts));
我将删除第一行,并将排序创建为可观察数组

function convertList(response) {  //just the function to convert the json object to a more useful array
    var names = [];
    var ingredients = [];
    var sorts = ko.observableArray([]);
    ...

问题是,当您绑定此文件时:

 <td data-bind="text: $data.name"></td>
Knockout会很高兴地绑定这样的属性,并显示它们,但对它们的任何更新对Knockout都是不可见的。相反,除了您的
ObservalArray
,您还需要使您想要更新Observalable的任何单个属性也可以:

sorts[i]['name'] = ko.observable(names[i]);
然后,当您更新它时,knockout将看到更改。但是请注意,您不能简单地分配给属性,因为您只会覆盖淘汰的可观察对象,它将丢失,相反,您需要使用更新调用可观察对象:

self.sorts[0]["name"]("test");

问题是,当您绑定此文件时:

 <td data-bind="text: $data.name"></td>
Knockout会很高兴地绑定这样的属性,并显示它们,但对它们的任何更新对Knockout都是不可见的。相反,除了您的
ObservalArray
,您还需要使您想要更新Observalable的任何单个属性也可以:

sorts[i]['name'] = ko.observable(names[i]);
然后,当您更新它时,knockout将看到更改。但是请注意,您不能简单地分配给属性,因为您只会覆盖淘汰的可观察对象,它将丢失,相反,您需要使用更新调用可观察对象:

self.sorts[0]["name"]("test");

可能发生的情况是knockout.js正在监视对数组的更改,而不是对变量的更新。当您添加新元素时,您正在更改数组的内容,但当您更新元素时,您正在更改变量,但数组可以保留指向其已有变量的所有相同指针。您可能需要在击倒中触发刷新事件。是的,看起来您没有使用任何可观察对象?这真的使得使用击倒毫无意义。我建议你读一些击倒tutorials@JasonSpake我使用的是可观测阵列。请看代码的开头。我做得不对吗?@tswei我该如何刷新?您可以在这里尝试解决方案:可能发生的是knockout.js正在监视数组的更改,而不是变量的更新。添加新元素时,更改数组的内容,但更新元素时,更改变量,但数组可以