Backbone.js和嵌入式一对多关联

ibl*_*lue 6 javascript json mongodb coffeescript backbone.js

应用布局

我正在构建一个App,可以创建调查.每项调查都有多个问题.我将问题嵌入到调查模型中(使用embeds_manyMongoid),因此调查可能如下所示:

{
  "id":    "4f300a68115eed1ddf000004",
  "title": "Example Survey",
  "questions": 
  [
    {
      "id":      "4f300a68115eed1ddf00000a",
      "title":   "Please describe your experience with backbone.js", 
      "type":    "textarea"
    },
    {
      "title":   "Do you like it?", 
      "id":      "4f300a68115eed1ddf00000b",
      "type":    "radiobutton",
      "options": ["Yes", "Yes, a lot!"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在,还有一个调查编辑器,由a组成SurveyView,显示调查并列出问题.如果我点击一个问题,QuestionView会弹出一个,我可以编辑问题.当我对我的调查感到满意并单击"保存"时,SurveyModel将发送到服务器.

问题

处理嵌入式关联的最佳方法是什么?

如果我survey.get("questions")[any_index]转到QuestionView,并且问题发生了变化,我必须question.id在我的模型中手动搜索并更新我的模型.这感觉不对.

如果我QuestionsCollection在我的中创建一个SurveyModel(这是否可能?).然后我可以做一些事情,比如Question通过id取出这个集合,将它传递给视图,当我更改模型时,一切都会自动更新,但是我必须url在集合中指定一个,而骨干将发送单个问题到如果事情得到更新,服务器.

关于如何做骨干方式的任何建议?

ibl*_*lue 15

在backbone.js中进行嵌入式一对多关联的方法

我已经实现了@Sander的答案,只想发布一些代码:

class Survey extends Backbone.Model

  # Handles the Survey.questions association to parse stuff from the server
  parse: (resp) ->
    if @attributes?.questions?
      @attributes.questions.reset(resp.questions)
    else
      resp.questions = new QuestionsCollection(resp.questions)
    resp

  # Recollects Survey.questions
  toJSON: ->
    attributes = _.clone(@attributes)
    attributes.questions = attributes.questions.toJSON()
    attributes
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

survey = Survey.get("my-id")
survey.questions.at(0).title = "First question"
survey.questions.at(1).title = "Second question"
survey.save()
Run Code Online (Sandbox Code Playgroud)

哪个工作很舒服.

  • 如果可以的话,我会给你+1万!100万-1(对于丑陋的coffescript :)) (3认同)

San*_*der 5

你当然可以在SurveyModel里面有一个问题收集.

但你对这个被视为单个问题的问题是正确的(因为每个问题都应该有自己的ID,所以仍然可以在服务器上知道它属于哪个调查......)

然后解析你的json:如果你手动构建你的集合和模型,你将不会遇到这个问题,但是如果你要添加你的嵌套JSON,它将不会自动为你的模型创建一个子集合.你需要在重写的解析方法中指定这样的东西.