マッピングプラグインを使用してマップされたKnockoutにビュー モデルがあります。データ (JSON オブジェクト) は Ajax 呼び出しを使用してサーバーから取得されるため、そうする必要があります。
私の問題は、フォームを変更すると、マップされたデータがオブジェクトで更新されないことです...
これは、次の JSFiddle の動作でも確認できます: http://jsfiddle.net/etiennenoel/4EXSy/6/
サーバーから取得したオブジェクトは次のとおりです。
var dataContent =
[
{
playerId: 2,
playerName: "allo",
evaluatedExercises:
[
{
id: 1,
evaluationExerciseId: 1,
numberOfTries: 6,
tries: [
{
id: 0,
number: 0,
result: 0
}
]
}
]
}
]
完全な JavaScript ビュー モデルは次のとおりです。
function Try(id, number, result) {
var self = this;
self.id = id;
self.number = number;
self.result = result;
}
function ExerciseResult(id, evaluationExerciseId) {
var self = this;
self.id = id;
self.evaluationExerciseId = evaluationExerciseId;
self.tries = [];
}
function PlayerEvaluation(playerId, playerName) {
var self = this;
self.playerId = playerId;
self.playerName = playerName
self.evaluatedExercises = [];
}
function appViewModel() {
var self = this;
self.playersEvaluation = ko.observableArray();
self.exportToJSON = ko.computed(function() {
return ko.toJSON(self.playersEvaluation);
}, this);
}
var viewModel = new appViewModel();
var dataContent =
[
{
playerId: 2,
playerName: "allo",
evaluatedExercises:
[
{
id: 1,
evaluationExerciseId: 1,
numberOfTries: 6,
tries: [
{
id: 0,
number: 0,
result: 0
}
]
}
]
}
]
for(i = 0; i < dataContent.length; i++) {
playerEvaluation = new PlayerEvaluation(dataContent[i].playerId, dataContent[i].playerName);
evaluatedExercises = dataContent[i].evaluatedExercises;
for(j = 0; j < evaluatedExercises.length; j++) {
exerciseResult = new ExerciseResult(evaluatedExercises[j].id, evaluatedExercises[j].evaluationExerciseId);
tries = evaluatedExercises[j].tries;
for(k = 0; k < tries.length; k++) {
exerciseTry = new Try(tries[k].id, tries[k].number, tries[k].result)
exerciseResult.tries.push(exerciseTry);
}
playerEvaluation.evaluatedExercises.push(exerciseResult);
}
viewModel.playersEvaluation.push(playerEvaluation);
}
ko.mapping.fromJS(viewModel.playersEvaluation);
ko.applyBindings(viewModel)
このオブジェクトは、KnockoutJS を使用して html にマップされます。
<table class="table table-hover table-bordered">
<thead> <!-- This will be generated with Twig so it is normal that is does not correspond to the data below -->
<tr>
<th>Nom</th>
<th colspan="6" style="text-align:center">Élément #1</th>
</tr>
<tr>
<th></th>
<th class="try">
1
</th>
<th class="try">
2
</th>
<th class="try">
3
</th>
<th class="try">
4
</th>
<th class="try">
5
</th>
<th class="try">
6
</th>
</tr>
</thead>
<tbody data-bind="foreach: playersEvaluation">
<tr data-bind="">
<td data-bind="text: $data.playerName">
</td>
<!-- ko foreach: $data.evaluatedExercises -->
<!-- ko foreach: $data.tries -->
<td>
<input type="text" data-bind="value: $data.result" />
</td>
<!-- /ko -->
<!-- /ko -->
</tr>
</tbody>
</table>
<div data-bind="text: exportToJSON()">
</div>
入力を変更したら、その変更をself.playersEvaluation
viewModel の変数に反映させたいと考えています。そのために、テーブルの下の div に、playersEvaluation の内容を表示する計算関数を作成しました。
ただし、div は更新されないため、マッピングが適切ではないという結論に達しました。
マッピングが間違っている場所は?