이렇게 예상대로 작동하는 것이 좋습니다. JSON 요청에서 데이터를 가져온 다음 매핑 플러그인을 사용하여 매핑합니다. 클릭 바인딩에서 중첩 배열에 새 값을 추가하고 싶습니다.knockout.mapping plugin 및 knockoutjs로 만든 중첩 된 관측 가능 배열에 새 값 추가
바로 지금 내 코드에서 addPoint가 정의되지 않았다는 오류가 발생합니다.
보기 :
<table>
<tbody data-bind='template: {name: "statRowTemplate", foreach: stats }'></tbody>
</table>
<script id="statRowTemplate" type="text/html">
{{if type() != "column"}}
<tr>
<td><label>Name: </label><input data-bind="value: name" /></td>
<td>
<label>Plot Points: </label><ul class="list-plot-points" data-bind="template: {name: 'dataTemplate' , foreach: data}"></ul>
<button data-bind="click: addPoint">Add Point</button>
</td>
</tr>
{{/if}}
</script>
<script type="text/html" id="dataTemplate">
<li>
<input data-bind="value: val" />
</li>
</script>
<button data-bind="click: saveChanges">Save Changes</button>
보기 모델
var viewModel = {};
$.getJSON('data-forecast-accuracy.json', function(result) {
function mappedData(data) {
this.val = data;
}
//override toJSON to turn it back into a single val
mappedData.prototype.toJSON = function() {
return parseInt(ko.utils.unwrapObservable(this.val), 10); //parseInt if you want or not
};
var mapping = {
'data': {
create: function(options) {
return new mappedData(options.data)
}
}
}
viewModel.stats = ko.mapping.fromJS(result, mapping);
viewModel.addPoint = function() {
this.stats.data.push(new mappedData(0));
}
viewModel.saveChanges = function() {
var unmapped = ko.mapping.toJSON(viewModel.stats);
//console.log(unmapped);
$.post('save-changes.php', {data: unmapped})
.success(function(results) { console.log("success")})
.error(function() { console.log("error"); })
.complete(function() { console.log("complete"); });
}
ko.applyBindings(viewModel);
});
json으로 :
[{"type":"spline","marker":{"symbol":"diamond"},"name":"Cumulative","data":[10,17,18,18,16,17,18,19]},{"type":"spline","marker":{"symbol":"circle"},"name":"Monthly","data":[10,22,20,19,8,20,25,23]}]
나는에 포인트를 추가하기 위해 이전 응답에서이 jsfiddle을 조정 할 수 있었다 단일 배열. 생성 된 매핑을 통해이를 구현하는 방법을 찾아야합니다. 당신이보기 모델의 하위 속성에 대한 템플릿 안에이기 때문에
는
나는 두 가지를 시도하고 내가 무엇입니까 error'Uncaught TypeError : undefined의 'push'메소드를 호출 할 수 없습니다. 새로운 배열을 각 배열에 독립적으로 추가 할 수 있기를 원했기 때문에 통계 템플릿에 버튼을 두었습니다. –
OK- 실제로 addPoint 메소드가'stats'의 특정 항목을 다루길 원합니다. 'stats'에 대한 매핑을 추가하고 거기에 addPoint 메소드를 추가하거나 viewModel에 addPoint를 사용하여 stat를 첫 번째 매개 변수로 사용할 수 있습니다. '$ data'는 stats의 특정 항목이 될 것이고 당신은 그 데이터를 push 할 수 있습니다. –