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'
});
解决方法:
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