0

有点奇怪...

我有收藏:

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>

该系列作品...

console.log(@collection)

显示数据!然而

@collection.each(@appdenDropdown)

不做任何事情,不出错,或通过任何事情。它只是没有做任何事情。我正在尝试从集合中提取数据!但它不会...

4

2 回答 2

3

这是因为集合中还没有任何内容。

@collection.fetch()在初始化程序中是一个异步方法。在遍历集合项之前,您必须等到提取完成。

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

所以你可以更新你的初始化代码,等到集合被获取后再调用render. 这是代码。

initialize: ->
  @collection = new Store.Collections.Product()
  @collection.fetch
    success: =>
      @render()
于 2012-07-19T15:02:28.643 回答
0

其他人提到的问题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它,这正是您想要的。我认为这应该有效。

几个很好的参考deferred

于 2012-07-19T23:15:27.580 回答