Backbone.js 主干关系获取未发送请求
我在Rails 3.2后端使用backbone.js和backbone relational 0.5.0。我有一个卡片模型,上面有很多注释 以下是我的JS模型和集合:Backbone.js 主干关系获取未发送请求,backbone.js,fetch,backbone-relational,Backbone.js,Fetch,Backbone Relational,我在Rails 3.2后端使用backbone.js和backbone relational 0.5.0。我有一个卡片模型,上面有很多注释 以下是我的JS模型和集合: Workflow.Collections.Cards = Backbone.Collection.extend({ model: Workflow.Models.Card, url: '/cards' }); Workflow.Models.Card = Backbone.RelationalModel.extend(
Workflow.Collections.Cards = Backbone.Collection.extend({
model: Workflow.Models.Card,
url: '/cards'
});
Workflow.Models.Card = Backbone.RelationalModel.extend({
modelName : 'card',
urlRoot : '/cards',
relations: [
{
type: Backbone.HasMany,
key: 'notes',
relatedModel: 'Workflow.Models.Note',
collectionType: 'Workflow.Collections.Notes',
includeInJSON: false,
reverseRelation: {
key: 'card',
includeInJSON: 'id'
}
}]
});
Workflow.Collections.Notes = Backbone.Collection.extend({
model: Workflow.Models.Note,
url: '/cards/74/notes' // intentionally hard-coded for now
});
Workflow.Models.Note = Backbone.RelationalModel.extend({
modelName : 'note',
urlRoot : '/notes'
});
正常的抓取非常有效,但是当我在控制台中尝试fetchRelated时,会得到一个空数组:
card = new Workflow.Models.Card({id: 74}) // cool
card.fetch() // hits the sever with GET "/cards/74" - works great
card.fetchRelated('notes') // [] - didn't even try to hit the server
奇怪的是,这是有效的:
card.get('notes').fetch() // cool - GET "/cards/74/notes"
我可以使用该方法解析响应文本,但感觉非常脏
有人知道我错过了什么吗
提前谢谢,这真是折磨我
Stu您应该使用
Note
ids数组创建Card
:Card=newworkflow.Models.Card({id:74,notes:[74,75]})编码>并相应更改注释的url
方法:
Workflow.Collections.Notes = Backbone.Collection.extend({
model: Workflow.Models.Note
});
Workflow.Models.Note = Backbone.RelationalModel.extend({
modelName : 'note',
urlRoot : function () {
return this.get('card').url() + '/notes';
}
});
card = new Workflow.Models.Card({id: 74, notes: [74, 75]});
card.fetchRelated('notes');
我应该在不久前发布我的解决方案-可能有更好的方法,但这是我遵循的惯例:
以下所有代码都在卡片视图中(显示注释的位置)
首先,我将renderNotes
方法绑定到卡的notes集合上的'reset'
事件:
initialize: function () {
_.bindAll(this);
this.model.get('notes').on('reset', this.renderNotes);
var self = this;
this.model.get('notes').on('add', function(addedNote, relatedCollection) {
self.renderNote(addedNote);
});
}
我还绑定到该集合上的'add'
,以调用单个renderNote
renderNotes和renderNote方法的工作原理如下:
renderNotes: function () {
if (this.model.get('notes')) {
this.model.get('notes').each(this.renderNote);
}
},
renderNote: function (note) {
var noteView = new Workflow.Views.Note({ model: note });
this.$('.notes').append(noteView.render().el);
},
然后,拼图的最后一块是实际点击服务器获取卡片的注释(这将触发我上面绑定的'reset'
事件)。我在卡视图的render
方法中执行此操作:
render: function () {
// render all of the eager-loaded things
this.model.get('notes').fetch();
return this;
},
@user1248256好心地帮我在我的OP上的评论中解决了这个问题,混淆主要是因为我希望fetchRelated
拉下延迟加载的记录——事实并非如此
作为旁注,此视图实际上是一个模式视图,可以打开和关闭(从页面中删除)。为了防止中所述的僵尸事件问题,我还手动解除了上述事件的绑定。谢谢,我将在访问计算机时尝试此操作!我可以问一下,给卡片上一些注释是为了什么目的吗?我正在尝试延迟加载这些数据,而不是在页面加载时将其下载,并引导卡片等,因此我的卡片JS模型很可能在获取它们之前不知道它们的注释……好的,继续。它为我们指定的每个音符触发一个GET。你知道我是否可以使用fetchRelated来完全延迟加载笔记吗?我想从服务器上取下新的…好的,我同意你的观点。我已经浏览了主干关系源代码,我认为如果没有相应的model-ids数组,就无法使用fetchRelated
。顺便说一句,您可以查看[单元测试][1]中的用法示例fetchRelated
。因此,当您获取卡时,您可以获取Note
ids数组,然后调用fetchRelated
。或者你不想这样做?[1] :单元测试很好,我来看看。我想我可以改变我的API,让更精简的卡版本只为每个音符引导一个id,然后在需要时延迟加载。我主要关心的仍然是在过渡期间添加的注释。我已经阅读了更多的文档,我想我可以在notes集合上指定一个prase()方法,以确保calling card.get('notes').fetch()将填充一张卡的所有notes集合,而不必事先知道ID。一旦我调整了它,我会发布解决方案。谢谢你的帮助!您还可以覆盖卡的fetchRelated()
,首先fetchRelated()
集合,然后调用父级的fetchRelated()
。我还没有尝试过这种方法,但我正在考虑,因为我也希望延迟加载ID,以减少数据库上不必要的负载。