2012-07-24 94 views
0

我想要以下内容。想象一下,你有一个家庭作业,有几个问题和一个等级。每个问题都有几个部分和难度。每个部分都有属性对或错。我想通过嵌套模型实现该逻辑(或者真的,但是你可以做到这一点,这只是我最好的猜测)。所以会有一个模型“部分”,它有一个属性对或错。那么就会有一个叫做问题的模型,它有几个相关的部分(一个集合?不知道这是否可能)和属性困难。然后你会有一个模型作业,它会有几个与它相关的问题和一个属性等级。backbone.js在其他模型中呈现/创建多个模型

我的问题是:

这可能吗?如果是这样,您的一般模型创建的语法是什么?渲染这个的语法是什么?

我正在寻找的东西一般是这样的:

var Homework=Backbone.model.extend({ 
    defaults:{ 
    grade:100, 
    parts: var parts=Backbone.model.extend({ .... //this definitely seems wrong }); 
    }, 
}); 

var Homeworkview=Backbone.view.extend({ 
    initialize: function(){ 
    //create one question with one part 
    }, 
    render: function(){ 
    //render template for homework grade then call function to render question, which then renders parts}, 
}); 

那么,你如何做到这一点?

+0

如果可能的话,是否有人介意提供骨干关系模型何时适用以及何时rjz方法合适的简要描述?谢谢! (我正在阅读:http://antoviaque.org/docs/tutorials/backbone-relational-tutorial/) – Mark 2012-07-24 06:47:58

回答

1

有很多方法可以做到这一点。 Backbone Layout Manager提供了一种处理嵌套模型的好方法,但对于更小的(或更专业的)应用程序,您可能会发现自己想要推出自己的模型。由于HomeworkProblem之间的关系看起来与ProblemPart之间的关系非常相似,因此您可以采用以下方法处理前者之间的关系。

开始通过定义模型和集合:

var Problem = Backbone.Model.extend({ 
    // defaults, constructor, etc. 
}); 

var ProblemCollection = Backbone.Model.extend({ 
    model: Problem 
}); 

下,“父”模式将需要一些方法来跟踪问题的集合。我写了一个小more explanation here如果需要的话,但总的想法是这样的:

var Homework = Backbone.Model.extend({ 

    defaults:{ 
    grade:100, 
    problems: [] 
    }, 

    initialize: function() { 
    // initialize a collection of the "Problems" in this Homework 
    this.problems = new ProblemCollection(this.get('parts')); 
    } 
}); 

下一步,景色。孩子的观点可以是任何你想要的。

var ProblemView = Backbone.View.extend({ 
    tagName: 'li' 
    // rendering, initializers, etc. 
}); 

父视图可能会更复杂一点。由于您有Homework模型中存储的所有Problem模型的集合,因此您可以根据需要为每个模型创建一个新视图。

var HomeworkView = Backbone.View.extend({ 

    render: function() { 

    // create a container for problems 
    var $problems = $('<ul class="problem-list"></ul>'); 

    // create a view for each problem 
    this.model.problems.each(function (model) { 
     var $problem = $('<li class="problem"></li>'), 
      problemView = new ProblemView({ 
      model: model, 
      el: el 
      }); 
     $problems.append($problem); 
    }); 

    this.$el.empty().append($problems); 

    return this; 
    } 
}); 

希望这有助于!

+0

奇妙的是,这非常有帮助。我会接受这个答案,如果有一个令人满意的理由使用这个而不是关系(我认为我喜欢这个方法稍微好一点) – Mark 2012-07-24 06:49:49

+0

也是,this.problem = new ProblemCollection(this.get('parts “));正确的语法?你不需要做this.set({problem:new ProblemCollection(this.get('parts')); – Mark 2012-07-24 07:06:31

+0

如果你想将集合设置为模型属性,你可以使用'set',但简单的例子在这里概述)它可能更容易将它直接附加到模型类和绕过序列化/验证/等,等等。 – rjz 2012-07-24 07:14:30