Backbone.js未在集合中迭代

Backbone.js未在集合中迭代,backbone.js,coffeescript,Backbone.js,Coffeescript,有点奇怪 我有收藏: class Store.Collections.Product extends Backbone.Collection url: '/api/products' model: Store.Models.Product 有人认为: class Store.Views.Origin extends Backbone.View initialize: -> @collection = new Store.Collections.Product

有点奇怪

我有收藏:

class Store.Collections.Product extends Backbone.Collection

  url: '/api/products'

  model: Store.Models.Product  
有人认为:

class Store.Views.Origin extends Backbone.View

  initialize: ->
    @collection = new Store.Collections.Product()
    @collection.fetch() 
    @model.bind('change:formatted', @render, this);
    @render()

  events:
    'change [name=origin]': 'setOrigin'

  el: =>
    @options.parent.$('.origin-input')[0]

  template: JST["backbone/templates/shapes/product"]

  render: ->
    $this = $(this.el)
    $this.html(@template(model: @model.toJSON(), errors: @model.errors))
    console.log(@collection)
    @collection.each(@appdenDropdown)
    @delegateEvents()
    this

  appdenDropdown: (product) ->
    console.log("append trigger")
    #view = new Store.Views.Products(model: product)
    #$('#history').append(view.render().el)
使用模板:

  <div id="history"></div>
显示数据!然而

@collection.each(@appdenDropdown)

不做任何事,不出错,或通过任何事情。这根本没用。我正试图从收集中提取数据!但它不会…

因为这个系列中还没有任何东西

初始值设定项中的
@collection.fetch()
是一个异步方法。在遍历集合项之前,必须等待获取完成

fetch()
函数接受可选的成功回调,该回调在提取完成时触发

因此,您可以更新初始值设定项代码,以便在调用
render
之前等待获取集合。这是代码

initialize: ->
  @collection = new Store.Collections.Product()
  @collection.fetch
    success: =>
      @render()

因为收藏品中还没有什么

初始值设定项中的
@collection.fetch()
是一个异步方法。在遍历集合项之前,必须等待获取完成

fetch()
函数接受可选的成功回调,该回调在提取完成时触发

因此,您可以更新初始值设定项代码,以便在调用
render
之前等待获取集合。这是代码

initialize: ->
  @collection = new Store.Collections.Product()
  @collection.fetch
    success: =>
      @render()

其他人提到的问题是
fetch
是异步的,但解决方案更简单:jQuery的
deferred
对象:

initialize: ->
  @collection = new Store.Collections.Product()
  @collection.deferred = @collection.fetch()

  @model.bind('change:formatted', @render, this);
  @collection.deferred.done ->
    @render()
这里发生的事情是,当您调用
@collection.deferred.done
时,您告诉jQuery在对其执行
render
之前等待集合加载,这正是您想要的。我认为这应该行得通

关于延迟的
的几篇很好的参考文献:


其他人提到的问题是
fetch
是异步的,但解决方案更简单:jQuery的
延迟对象:

initialize: ->
  @collection = new Store.Collections.Product()
  @collection.deferred = @collection.fetch()

  @model.bind('change:formatted', @render, this);
  @collection.deferred.done ->
    @render()
这里发生的事情是,当您调用
@collection.deferred.done
时,您告诉jQuery在对其执行
render
之前等待集合加载,这正是您想要的。我认为这应该行得通

关于延迟的
的几篇很好的参考文献:


检查或顺便问一下:当你有
这个时,
$this=…
为什么要这样做。$el
。我建议阅读backbone.js文档,并明确nikoshr的答案:collection.fetch是
异步的
,您可能在fetch返回之前用initialize方法呈现视图,因此集合是空的。console.log是
wtfsynchronous
,因此它将集合记录为已填充。您需要做的是将render方法绑定到集合的reset事件,以确保视图在集合被填充后也得到渲染。请看,集合不是空的,因为它在console.log中显示了它的数据,我只是用它来测试console.log,它显示了一个填充的集合,我链接的第二个答案对此进行了解释。小结:console.log玩把戏,在登录之前克隆集合,看看你得到了什么检查或顺便说一句:当你有
这个时为什么要
$this=…
。$el
。我建议阅读backbone.js文档,并明确nikoshr的答案:collection.fetch是
异步的
,您可能在fetch返回之前用initialize方法呈现视图,因此集合是空的。console.log是
wtfsynchronous
,因此它将集合记录为已填充。您需要做的是将render方法绑定到集合的reset事件,以确保视图在集合被填充后也得到渲染。请看,集合不是空的,因为它在console.log中显示了它的数据,我只是用它来测试console.log,它显示了一个填充的集合,我链接的第二个答案对此进行了解释。小结:console.log玩把戏,在登录之前克隆集合,看看你能得到什么。你能停止一切直到集合被填满吗?@CharlieDavies这样的做法会让MVC无法像那样等待。另一种方法是让视图侦听集合重置以执行渲染。this.collection.on('reset',this.render,this));因此,当您执行抓取(触发“重置”事件)时,将自动调用render。您能停止所有操作直到集合填满吗?@CharlieDavies这样做会让MVC无法像那样等待。另一种方法是让视图侦听集合重置以执行渲染。this.collection.on('reset',this.render,this));因此,当您执行抓取(触发“重置”事件)时,将自动调用render。更正:我认为@Paul使用
成功
回调的回答实际上也做了同样的事情。感谢您的帮助,这对我来说现在更有意义了!非常感谢!更正:我认为@Paul使用
success
回调的回答实际上也做了同样的事情。谢谢你的帮助,这对我来说现在更有意义了!非常感谢!