' Backbone Relational'模型关系增加了一个' id'将集合作为值,防止PUT和DELETE

时间:2014-06-03 17:10:45

标签: javascript api backbone.js backbone-relational

我成功实现了从我创建的API加载和显示与'Backbone Relational'的关系。我通过反复试验了解事情是如何运作的。我确实认为文档缺乏一定的清晰度,因为它花了很多时间来弄清楚它是如何工作的。特别是关于如何将事物映射到API我认为文档缺乏一点。

问题
添加书签有效,编辑和删除无效。 PUT变为POST,DELETE根本不会触发。当我将id设置为硬编码的模型时,它确实有效。因此,id缺失,这对于PUT成为POST是有意义的。

问题似乎是id不包含实际的id,而是一个集合。发生问题的视图不需要BookmarkBinding,它在其他地方使用。简单地说,将Bookmark作为关系使DELETE和PUT断开。

BookmarkBinding模型:

App.Model.BookmarkBinding = Backbone.RelationalModel.extend({
    defaults: {
        set_id: null,
        bookmark_id: null
    },
    relations: [{
        type: Backbone.HasOne,
        key: 'bookmark',
        relatedModel: 'App.Model.Bookmark',
        reverseRelation: {
            type: Backbone.HasOne,
            key: 'id'
        }
    }],
    urlRoot: 'http://api.testapi.com/api/v1/bookmark-bindings'
});

书签型号:

App.Model.Bookmark = Backbone.RelationalModel.extend({
    defaults: {
        url: 'undefined',
        description: 'undefined',
        visits: 0,
    },
    relations: [{
        type: Backbone.HasMany,
        key: 'termbindings',
        relatedModel: 'App.Model.TermBinding',
        reverseRelation: {
            key: 'bookmark_id',
        }
    }],
    urlRoot: 'http://api.testapi.com/api/v1/bookmarks'
});

2 个答案:

答案 0 :(得分:3)

来自Backbonejs.org

  

默认同步处理程序将CRUD映射到RESTful HTTP方法,如下所示:

create → POST   /collection
read → GET   /collection[/id]
update → PUT   /collection/id
delete → DELETE   /collection/id

您的问题表明您正在发出HTTP PUT请求,因此需要进行Backbone更新。如果要进行HTTP POST,请使用Backbone create。 PUT请求映射到更新,并要求在URL中发送id,这不会根据您的服务器日志发生。如果你正在创建一个新对象,那么大多数服务器端框架(如Rails / Sinatra / Zend)将为该对象创建一个id

另一个可能的错误来源是您为关系选择的密钥,就像您怀疑的那样。

Bookmark有许多BookmarkBindings,似乎Backbone-relational会将它们存储在您在BookmarkBindings.relations.reverseRelation.key中指定的字段中,该字段当前定义为“id”。 因此,相关BookmarkBindings id的集合将存储在与Bookmark.id相同的属性上,从而产生冲突。 Backbone.sync将向服务器(您在日志中看到)发送一个未定义的值,因为它在那里找到一个集合而不是一个整数。

第一个建议 - 您可能不需要双向关系,在这种情况下,将其从BookmarkBinding模型中删除。

第二个建议 - 在另一个键上定义反向关系,这样它就不会与Bookmark.id冲突,例如BookmarkBindings.relations.reversRelation.key:'binding_ids'

  • 正当披露 - 我从未使用过Backbone-relational.js,只使用了Backbone.js。

答案 1 :(得分:2)

问题在于,在编辑或删除书签模型时,书签装订模型也希望这样做,因为它与书签相关。我已经尝试删除没有被证明是解决方案的反向关系,因为在我的应用程序的其他部分,我使用书签绑定的东西将不再起作用。

<强>解决方案
我最终删除了反向关系(@jarede +1!),但关键是如何实现外键从API获取关系而没有反向关系。我最后添加了keySourcekeyDestination,这使得一切顺利。

<强>旁注
Backbone Ralational也无法处理相同的外键,这也给我带来了一些问题。这将使最后声明的外键覆盖所有以前的外键。这可能是非常不切实际的,因为在API中,模型与名为id的列相关并不罕见。因此,idAttribute可以设置为idAttribute: '_id',但外键在您的应用程序中必须是唯一的。

BookmarkBinding模型:

App.Model.BookmarkBinding = Backbone.RelationalModel.extend({
    defaults: {
        set_id: null,
        bookmark_id: null
    },
    relations: [{
        type: Backbone.HasOne,
        key: 'bookmark',
        keySource: 'id',
        keyDestination: 'bookmark',
        relatedModel: 'App.Model.Bookmark'
    }],
    urlRoot: 'http://api.testapi.com/api/v1/bookmark-bindings'
});