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!"]
    }
  ]
}
现在,还有一个调查编辑器,由a组成SurveyView,显示调查并列出问题.如果我点击一个问题,QuestionView会弹出一个,我可以编辑问题.当我对我的调查感到满意并单击"保存"时,SurveyModel将发送到服务器.
处理嵌入式关联的最佳方法是什么?
如果我survey.get("questions")[any_index]转到QuestionView,并且问题发生了变化,我必须question.id在我的模型中手动搜索并更新我的模型.这感觉不对.
如果我QuestionsCollection在我的中创建一个SurveyModel(这是否可能?).然后我可以做一些事情,比如Question通过id取出这个集合,将它传递给视图,当我更改模型时,一切都会自动更新,但是我必须url在集合中指定一个,而骨干将发送单个问题到如果事情得到更新,服务器.
关于如何做骨干方式的任何建议?
ibl*_*lue 15
我已经实现了@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
然后我可以这样做:
survey = Survey.get("my-id")
survey.questions.at(0).title = "First question"
survey.questions.at(1).title = "Second question"
survey.save()
哪个工作很舒服.
你当然可以在SurveyModel里面有一个问题收集.
但你对这个被视为单个问题的问题是正确的(因为每个问题都应该有自己的ID,所以仍然可以在服务器上知道它属于哪个调查......)
然后解析你的json:如果你手动构建你的集合和模型,你将不会遇到这个问题,但是如果你要添加你的嵌套JSON,它将不会自动为你的模型创建一个子集合.你需要在重写的解析方法中指定这样的东西.