主干.js和嵌入式一对多关联
Backbone.js and Embedded One-To-Many Associations
应用程序布局
我正在构建一个应用程序,可以在其中创建调查。每个调查都有多个问题。我正在将问题嵌入到调查模型中(Mongoid 中embeds_many
(,因此调查可能如下所示:
{
"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!"]
}
]
}
现在,还有一个调查编辑器,它由一个SurveyView
组成,它显示调查并列出问题。如果我单击单个问题,则会弹出一个QuestionView
,我可以在其中编辑问题。当我对我的调查感到满意并单击保存时,SurveyModel
将被发送到服务器。
问题所在
处理嵌入式关联的最佳方式是什么?
如果我将survey.get("questions")[any_index]
传递给QuestionView
,并且问题发生了变化,我必须在模型中手动搜索question.id
并更新我的模型。这感觉不对。
如果我在SurveyModel
中创建一个QuestionsCollection
(这可能吗?然后我可以做一些事情,比如通过 id 从这个集合中获取一个Question
,把它传递给视图,当我更改模型时,一切都会自动更新,但我必须在集合中指定一个url
,如果事情得到更新,主干将向服务器发送单个问题。
关于如何以骨干方式做到这一点的任何建议?
主干中嵌入一对多关联的方法.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
然后我可以做这样的事情:
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,它不会自动向模型创建子集合。您需要在重写的解析方法中指定此类内容。
我认为你甚至可以在构造中做到这一点
class Survey extends Backbone.Model
initialize: ->
@questions = new QuestionsCollection(@get('questions'))
您还可以普遍扩展模型以获取嵌套数据:
_.extend Backbone.Model::, deepToJSON: ->
obj = @toJSON()
_.each _.keys(obj), (key) ->
obj[key] = obj[key].deepToJSON() if _.isFunction(obj[key].deepToJSON)
obj
_.extend Backbone.Collection::, deepToJSON: ->
@map (model) ->
model.deepToJSON()
覆盖parse/toJSON是一个可行的解决方案。需要注意的一个问题是,当通过集合获取对象时,parse 方法中的"this"不是模型对象。然后发生的情况是调用解析并传递结果以进行初始化。可能需要"this"指向模型对象的原因是,如果要绑定集合上的事件。另一种方法是重写 set 方法。我在Github上发布了一个简单的脚本来展示这种方法。
- 如何在Parse中创建一对多关系
- Sails.js获得多对多关联计数
- Ember数据一对多关系不起作用
- 节点.js / 续集.js / 快递.js - 如何插入多对多关联?(同步/异步?
- 解析-在数组一对多关系中获取父项及其子项
- 集合作为 EmberJS 中的属性?(一对多关系)
- JayData一对多预测
- 我将如何解决余烬数据中的这种一对多态关系
- 与 RequireJS 和 Backbone 的一对多和一对一关系
- 从SQL一对多到解析NoSQL
- 续集JS:包括一对多关系船
- 帆.js:模型本身的一对多关系
- 余烬类型未定义且加载路线出错,具有一对多关联
- 流星:如何使关系一对多
- 如果一个模型在续集中引用自身,如何让所有孩子或父母在多对多关联中
- 对于具有一对多关系的主干模型,存储“;许多“;数组中的模型,而不是Collection
- Sails.js-一对多映射
- 主干.js和嵌入式一对多关联
- 如何使用Sails 0.10.x在一对多关系中引用关联模型
- Sequelize与Postgresql的一对多关联