KnockOut Mapping Hierarchical JS对象

时间:2012-03-05 22:49:09

标签: knockout.js knockout-mapping-plugin knockout-2.0

我正在尝试使用KnockOut映射插件创建视图模型,

这是对象,基本上下面是一个带有单词的句子。

var data = {
name: 'Example Title',
sentences: [
    {id: 1, words: [{text: 'word1'}, {text: 'word2'}]},
    {id: 2, words: [{text: 'word3'}, {text: 'word4'}]}
           ]};

我想有三个视图模型,

文章应包含句子,句子应包含单词

var ArticleViewModel = function(data) 
{
  var self = this;
  self.id = ko.observable(data.id);
  self.sentences = ko.observableArray([]);
}

var SentenceViewModel = function(data) 
{
  var self = this;
  self.id = ko.observable(data.id);
  self.words = ko.observableArray([]);
}

var WordViewModel = function(data) 
{
  var self = this;
  self.id = ko.observable(data.id);
  self.text = ko.observable(data.text);
}

我想把它放在View中,如下所示;

<p data-bind="foreach:sentences">
  <span data-bind="foreach:words">
     <span data-bind="text:text">
  </span>
</p>

我甚至不确定我想要实现的目标是可行的,但我想我需要映射,但我无法做到这一点,

这是我的一些试验,也许有助于更好地理解我的问题, http://jsfiddle.net/sureyyauslu/2wTjy/6/

提前多多感谢...

1 个答案:

答案 0 :(得分:8)

问题是你有一个p标签嵌套在另一个标签中。模板引擎无法解析这个不正确的标记。

当我认为你想要另一个foreach时,你也使用了with binding。

<p data-bind="foreach:sentences">
        <span data-bind="text:id"></span>
        <span data-bind="foreach:words">
            <span data-bind="text:text"></span>                   
        </span>
</p>

最后,句子模型可以简化为

var mySentenceModel = function(data) {
    var self = this;
    ko.mapping.fromJS(data, wordMapping, self);
}

您不需要定义ID等,因为映射插件都会对其进行处理。

http://jsfiddle.net/madcapnmckay/6hMA3/

希望这有帮助。