微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 与Backbone-Relational实现多对多关系

我有一个简单的应用程序,它定义了两个类,一个Person和一个PersonGroup,其中有一个多对多的关系.一个人可以没有组,也不能分配给所有组,以及介于两者之间的任何组.

backbonerelational.org上的示例建议使用中间模型来实现多对多关系,但是我无法使用此模式来获取(反序列化)和保存(序列化).

我想要做的是使用Backbone反序列化类似于以下内容JSON

{
    People:
    [
        {
            "ID": 1,"Name": "John"
        },{
            "ID": 2,"Name": "Bob"
        },{
            "ID": 3,"Name": "Tim"
        },],PeopleGroups:
    [
        {
            "ID": 1,"Name": "Owners","People":
            [
                1,2
            ],},"Name": "Everyone",2,3
            ],]
}

我正在使用Knockback / Knockout进行数据绑定,因此问题是我需要能够通过引用访问关系.除非我能创建一个Knockback.CollectionObservable来包装集合并将ID解析为引用,否则ID数组对我没有任何帮助.

解决方法

我最终以我想要的方式工作.多对多关系在数据库中维护,但只能在我的Backbone模型中以一个方向访问关系.我决定Person模型是独立的,PersonGroup模型会有一组对它们链接到的Person模型的引用.

这里使一切工作的关键点是指定includeInjsON:“ID”并删除reverseRelation.这仍然允许您在JavaScript中访问模型的引用,但它正确地序列化和反序列化为JSON. Person模型根本无法访问它们所在的组的导航属性,但是它们可以存在于多个组中.

我只是假设使用ID列表会强制跳过箍来解析引用,但Backbone-relational似乎使用全局Backbone模型存储来解析ID引用而不创建重复模型. (例如,三个不同的组可以引用同一个人,并且只创建一个模型).

var Person = Backbone.RelationalModel.extend(
{
    idAttribute: "ID",});

var PersonGroup = Backbone.RelationalModel.extend(
{
    idAttribute: "ID",relations:
    [
        {
            type: Backbone.HasMany,key: "People",relatedModel: "Person",collectionType: "PersonCollection",includeInjsON: "ID",});

如果它可以帮助任何人,那么这是管道的其余部分.您可以按如下方式定义Backbone.Collections并通过单独的API请求获取它们:

var PersonCollection = Backbone.Collection.extend(
{
    model: Person,url: "/api/person",});

var PersonGroupCollection = Backbone.Collection.extend(
{
    model: PersonGroup,url: "/api/persongroup",});

var PersonModels = new PersonCollection();

var GroupsModels = new PersonGroupCollection();

this.PersonModels.fetch();

this.GroupsModels.fetch();

this.People = kb.collectionObservable(
    this.PersonModels,{
        factories:
        {
            "models": Personviewmodel,}
);

this.PersonGroups = kb.collectionObservable(
    this.GroupsModels,{
        factories:
        {
            "models": PersonGroupviewmodel,"models.People.models": Personviewmodel,}
);

我包含了使用Knockout.js绑定的Knockback.js特定集合.每个模型只创建一个viewmodel,因此更改跟踪将在整个应用程序中传播.

原文地址:https://www.jb51.cc/js/158870.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐