【发布时间】:2017-03-15 21:13:46
【问题描述】:
我知道这个问题已经被问过很多次了,但没有一个回答我的问题。 我有以下内容: 我将数据通过 JSON 转换为 Javascript 到二维数组中。 当我加载网站时,表格会显示出来。 现在,当我单击一个按钮(仅用于测试)时,它正在更新数组中的一个值并将该数组记录在控制台中,在那里我可以看到更改后的数组。 问题是更改未显示在表格中。 当我只是向数组添加一个值时,它会显示在表中。 我做错了什么?
HTML:
<table id="sortsTable">
<tbody data-bind="foreach: sorts">
<tr>
<td data-bind="text: $data.name"></td>
<td data-bind="text: $data.ingName"></td>
</tr>
</tbody>
</table>
<button data-bind="click: addPerson">Add</button>
JS:
var sorts = ko.observableArray([]);
$(function() {
var request = new XMLHttpRequest();
var formData = new FormData();
var responseElements = [];
request.open("POST", "scripts.php", true);
formData.append("action", "getSorts");
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
responseElements = JSON.parse(request.responseText);
sorts = convertList(responseElements);
ko.applyBindings(new AppViewModel(sorts));
}
}
request.send(formData);
});
function convertList(response) { //just the function to convert the json object to a more useful array
var names = [];
var ingredients = [];
var sorts = [];
for (var index = 0; index < response.length; index++) {
var name = response[index]['name'];
var ing = response[index]['ingName'];
if (names.indexOf(name) == -1) {
names.push(name);
}
if (ingredients.indexOf(ing) == -1) {
var nameIndex = names.indexOf(name);
if (ingredients[nameIndex] == undefined) {
ingredients[nameIndex] = ing;
} else {
ingredients[nameIndex] = ingredients[nameIndex] + ", " + ing;
}
}
}
for (var i = 0; i < names.length; i++) {
sorts[i] = {};
sorts[i]['name'] = names[i];
sorts[i]['ingName'] = ingredients[i];
}
return sorts;
}
function AppViewModel(data) {
var self = this;
self.sorts = data;
self.addPerson = function() {
console.log("click");
self.sorts[0]["name"] = "test"; //doesn't update table
//self.sorts.push({name: "qwer", ingName: "we"}); //works like expected
console.log(self.sorts);
};
}
谢谢。
【问题讨论】:
-
可能发生的事情是,knockout.js 正在监视数组的更改,而不是变量的更新。当你添加一个新元素时,你正在改变数组的内容,但是当你更新一个元素时,你正在改变一个变量,但是数组可以保留所有指向它已经拥有的变量的相同指针。您可能需要在淘汰赛中触发刷新事件。
-
是的,您似乎没有使用任何可观察对象?这真的使得使用淘汰赛毫无意义。我建议你阅读一些淘汰赛教程
-
@JasonSake 我正在使用一个可观察的数组。查看代码的开头。我做得不对吗?
-
@tswei 这个提神怎么办?
-
您可以在这里尝试解决方案:stackoverflow.com/questions/13231738/…