KnockoutJS绑定不使用映射插件进行更新
KnockoutJS - binding does not update using mapping plugin
我在Knockout中有一个视图Model,它是使用映射插件映射的。我需要这样做,因为数据(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>
当我修改输入时,我希望这些更改反映在我的viewModel的self.playersEvaluation
变量中。为此,我创建了一个计算的Function,它在表下面的div中显示playersEvaluation的内容。
然而,div没有得到更新,因此我得出的结论是映射一定不正确
我的映射哪里出了问题?
我对映射插件并没有非常丰富的经验,但我认为你应该让它为你构建你的视图模型结构(因为你在视图模型的任何级别上似乎都没有任何更复杂的逻辑)
http://knockoutjs.com/documentation/plugins-mapping.html
function appViewModel() {
var self = this;
self.playersEvaluation;
}
var viewModel = new appViewModel();
// this creates observables for everything in dataContent. the result itself is an observable
// which you can set in your top level view model
viewModel.playersEvaluation = ko.mapping.fromJS(dataContent)
ko.applyBindings(viewModel);
Fiddle:http://jsfiddle.net/4EXSy/8/
相关文章:
- Wordpress更新后出现插件错误
- 自动调整jQuery插件的大小,触发自动调整更新
- 插件在WordPress 4.5更新后抛出TypeError
- jQuery自定义滚动条插件没有't使用水平滚动进行更新:true
- 使用PhoneGap和谷歌地图插件更新位置跟踪的标记位置
- 在第三次onPageClick事件后,使用twbspagination插件和AJAX更新JS分页
- jQuery插件-初始化后更新设置
- 该插件不适用于动态更新的数据
- 设置后如何在 jquery 插件上更新参数
- AngularJS选择的插件,选择:更新不起作用,在浏览器中工作
- 美国地图拉菲尔插件自动更新和动态填充颜色
- 更新脸书评论插件链接而不重新加载页面
- 插件在 jQuery 2.2.0 更新后停止工作
- 在 AJAX 页面更新后重新初始化 jQuery 插件
- 如何使 JQuery 屏蔽输入插件在 Ajax 更新面板中的异步回发后 asp.net 工作
- 选择的jquery插件未使用
- Angularjs没有使用alertify或对话框插件进行更新
- 更新jquery插件选项而不刷新页面
- 更新签名板插件上的选项
- jQuery插件更新URL哈希作为文本输入的变化