Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干关系获取未发送请求_Backbone.js_Fetch_Backbone Relational - Fatal编程技术网

Backbone.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(

我在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({
  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,以减少数据库上不必要的负载。