これは期待どおりに動作するように近いです。 JSONリクエストからデータを取得してから、マッピングプラグインを使用してマップします。クリックバインディングでネストされた配列に新しい値を追加したい。knockout.mappingプラグインとknockoutjsで作成されたネストされたobservable配列に新しい値を追加
私のコードでは、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を調整することができました単一アレイ。私は生成されたマッピングを介してこれを実装する方法を見つける必要があります。
私は両方の方法を試してみました、私は取得していますエラー 'Uncaught TypeError:未定義のメソッド 'push'を呼び出すことができません'私は統計情報テンプレートにボタンを置いた理由は、新しい項目を各配列に独立して追加できるようにするためです。 –
OK-あなたは本当にあなたのaddPointメソッドが 'stats'の特定の項目を扱うことを望んでいます。 'stats'のためのマッピングを追加してそこにaddPointメソッドを追加するか、viewModel上のaddPointに最初のパラメータとしてstatを渡すことができます。 '$ data'は統計情報の中の特定の項目になり、そのデータにプッシュすることができます。 –