编程语言
首页 > 编程语言> > javascript – ‘Backbone Relational’模型关系将一个’id’与一个集合作为值添加,防止PUT和DELETE

javascript – ‘Backbone Relational’模型关系将一个’id’与一个集合作为值添加,防止PUT和DELETE

作者:互联网

我成功地从我创建的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'
});

解决方法:

Backbonejs.org

The default sync handler maps CRUD to RESTful HTTP methods like so:

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.

标签:javascript,api,backbone-js,backbone-relational
来源: https://codeday.me/bug/20190830/1770439.html