使用Backbone-relational在Backbone中创建嵌套模型

时间:2011-08-29 08:04:35

标签: javascript backbone.js backbone-relational

我想使用backbone-relational在我的backbone.js应用程序中使用嵌套模型。

我能够按照文档中的示例来创建嵌套对象(例如,一对多关系)。但是我不明白如何以更新上层对象的方式绑定较低级别的元素。我认为一个有用的应用程序将是一个非常有用的教程。

所以我的问题是:如何使用backbone-relational扩展Todos tutorial以便:

  • 可以添加/删除每个项目的子项目
  • 双击任何子项目进行编辑(就像原来的Todo示例一样)
  • 点击某个项目会隐藏/显示其子项目
  • 子项不是单独获取的,而只是Todo项目的数组属性

更新:我有created a jsfiddle for this question。到目前为止,我有:

  • 导入上述Todo示例
  • 创建了TodoSubitem模型和TodoSubitemList集合
  • Todo模型更改为RelationalModel而不是Model,与HasMany
  • TodoSubitem关联
  • 在html代码中添加了subitem-template

但我仍然不确定如何:

  • subitems添加仅在您点击Todo div
  • 时显示的输入字段
  • 将子项数据作为Todo个对象的属性,但仍然TodoSubitemView将DOM元素绑定到它们(例如<li>标记)。

4 个答案:

答案 0 :(得分:11)

我不认为在这种情况下我会创建一个单独的'TodoSubItem' - 为什么不从Todo-&gt; Todo创建一个HasMany关系,所以一个Todo可以有0 .. * {{1 }和0..1 children

这样,您可以重复使用订单逻辑(如果您将其更改为应用于每个集合),可以根据需要创建更深的嵌套级别(或者如果您还想要限制到某个深度),等等。但是,为了适应这种情况,需要更新许多内容 - 例如,保留一个子视图列表,以便您可以循环遍历它们以将每个视图标记为已完成,并维护(和更新)每个{{1}的排序}。

无论如何,粗略概述一个可能的解决方案,让你开始,作为你当前版本的一种差异(对不起,它完全未经测试,因此可能包含可怕的错误):

parent

答案 1 :(得分:3)

我认为你不能在Backbone-relational中制作自我关联的模型(如此处的另一个答案所述)。当我尝试这个时,我得到一个错误:Backbone-relational需要在它可以与之建立关系之前定义relatedModel。

所以,我修改了骨干关系页面上描述的多对多模式:

https://github.com/PaulUithol/Backbone-relational#many-to-many-relations

本质上,我正在创建一个链接模型来包含对所引用模型的引用,以便在定义实际模型时,此链接模型可用于Backbone-relational。

我觉得将这个链接模型与关系中的两个数据模型分开一个单独的关系很方便,这样就可以执行查看关系查找。或者,您可以简单地将第二个模型填充到链接模型中,但是除非您在数据模型中明确地将链接模型添加到链接模型中,否则关系将是一个方向。

让我们创造一个“人物”。有孩子的模特是其他人的“人”。模型。

Person = Backbone.RelationalModel.extend({
relations: [
    {
        type: 'HasMany',
        key: 'Children',
        relatedModel: 'FamilyRelation',
        reverseRelation: {
            key: 'Childrenof'
        }
    },
    {
        type: 'HasMany',
        key: 'Parent',
        relatedModel: 'FamilyRelation',
        reverseRelation: {
            key: 'Parentof'
        }
    }
]
});

需要在&lt;之前定义FamilyRelation&gt; Person是,所以Backbone-relational可以创建链接,所以这在代码中的Person模型定义之前:

// FamilyRelation is link model between two "Person"s 
// to achieve the Fan/Admiree relation.

FamilyRelation = Backbone.RelationalModel.extend({
})

如果我们创建两个&#34; Person&#34; s:

KingKong = new Person({name: 'KingKong'});
SonOfKong = new Person({name: 'SonOfKong'});

然后,我们可以创建一个FamilyRelationship模型,该模型是父母的&#39; SonOfKong,用这条线将它添加到KingKong的孩子们身上:

KingKong.get("children").add({"parentof":SonOfKong});

然后,您可以向Person模型添加便利功能,从FamilyRelationship模型中检索嵌套模型,并且不再需要触及FamilyRelation,除了确保它被保存和适当地检索。

对于非等级关系(比如说朋友&#39;,而不是&#39;父/子&#39;,你仍然需要与链接模型的这两个关系,以便能够检索一个从另一个,这是一个黑客,但它的工作原理。

答案 2 :(得分:3)

经过一番摆弄后,我找到了一种创建真正嵌套模型的方法:

var theModel = Backbone.RelationalModel.extend({ [...] });
theModel.prototype.relations.push({
  type: Backbone.HasOne,
  key: 'key',
  relatedModel: theModel
});

在使用模型的时候(当推到原型上的关系时),它可用,从而使一切正常。

答案 3 :(得分:0)

这篇文章现在已经很老了,但我正在寻找相同的东西,并且认为我会分享我得到的解决方案。

要创建自引用模型,只需省略 Person = Backbone.RelationalModel.extend({ relations: [{ type: 'HasMany', key: 'Children', }] }) 即可。所以像这样:

horizontal

解释in the docs