나는 여러 번 이미 물었다는 것을 알고 있지만 그 중 아무도 내 질문에 대답했다. 다음과 같습니다. JSON에서 Javascript로 데이터를 가져와 2 차원 배열로 만듭니다. 사이트를로드 할 때 원하는 테이블이 표시됩니다. 이제 테스트를 위해 버튼을 클릭하면 배열의 값 하나가 업데이트되고 콘솔에 배열이 기록되어 변경된 배열을 볼 수 있습니다. 문제는 테이블에 변경 사항이 표시되지 않는다는 것입니다. 방금 배열에 값을 추가하면 테이블에 값이 표시됩니다. 내가 뭘 잘못하고 있니?녹아웃 JS 배열을 변경하면 업데이 트되지 않습니다
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가 배열에 대한 변경 사항을 모니터링하지만 변수에 대한 업데이트는 모니터링하지 않습니다. 새 요소를 추가 할 때 배열의 내용을 변경하지만 요소를 업데이트하면 변수가 변경되지만 배열은 이미 가지고있는 변수와 동일한 포인터를 모두 유지할 수 있습니다. 녹아웃에서 새로 고침 이벤트를 실행해야 할 가능성이 높습니다. – tswei
네, 관측 대상을 사용하고있는 것처럼 보이지 않습니까? 정말 녹아웃을 사용하여 무의미 해집니다. 나는 당신이 일부 녹아웃 튜토리얼을 읽을 것을 제안한다. –
@JasonSpake 나는 관찰 가능한 배열을 사용하고있다. 코드의 시작 부분을 살펴보십시오. 내가 제대로하지 않니? – jukisu