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 に答える