在Knockout中填充复杂的ViewModel

时间:2015-06-04 19:29:48

标签: javascript jquery knockout.js

一直试图找到一个例子,但没有运气。到目前为止,我对KO的使用仅限于相当基本的任务。现在我需要加载一个由其他模型组成的VM。仍然试图使用映射插件包围我,但由于某种原因没有得到它。小提琴,有一个工作版本,但它不是动态的。最终,我想从ajax调用中加载json。

如何使用映射加载它们?

var ContestModel = function (cm) {
    number: ko.obervable(cm.number);
    time: ko.observable(cm.time);
}

var CombatantModel = function (c) {
    name: ko.observable(c.name);
    weapon: ko.observable(c.weapon);
    kills: new ContestModel(c.kills);
    takedowns: new ContestModel(c.takedowns);
    throws: new ContestModel(c.throws);
}

var DivisionModel = function (d) {
    name: ko.observable(d.name);
    combatants: ko.observableArray([new CombatantModel()]);
}

http://jsfiddle.net/5vy52umm/2/

让我超越驼峰的任何想法?

1 个答案:

答案 0 :(得分:-2)

你太近了。因为ko.mapping.fromJS将数组转换为observableArray,所以只需将其输出直接分配给您想要的observableArray,而不是从中设置数组内容。 (或者,您可以提取其数组并从中设置内容。)

    self.divisions = ko.mapping.fromJS(divisions);

http://jsfiddle.net/5vy52umm/3/

好的,正如评论中所指出的,你的构造函数是

  1. 没有通过映射调用,因为它没有这样做
  2. 语法无效
  3. 假设你的意图只是将你的数据加载到你的模型中,而不是使用特定的功能。如果你想从JS数据中提取它们并将它们传递给你的构造函数(首先将它们变成有效的构造函数),你可以这样做。你不会使用ko.mapping,你只需要将普通的JS对象传递给构造函数,它看起来就像ko.mapping那样做:将JS对象转换为可观察对象。