我成功实现了从我创建的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'
});
答案 0 :(得分:3)
默认同步处理程序将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'
答案 1 :(得分:2)
问题在于,在编辑或删除书签模型时,书签装订模型也希望这样做,因为它与书签相关。我已经尝试删除没有被证明是解决方案的反向关系,因为在我的应用程序的其他部分,我使用书签绑定的东西将不再起作用。
<强>解决方案强>
我最终删除了反向关系(@jarede +1!),但关键是如何实现外键从API获取关系而没有反向关系。我最后添加了keySource
和keyDestination
,这使得一切顺利。
<强>旁注强>
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'
});