Визуализация базовых представлений с коллекцией в обратных вызовах - PullRequest
0 голосов
/ 02 апреля 2012

Вот вид, с которым я работаю:

class Raffler.Views.EntriesIndex extends Backbone.View
  template: JST['entries/index']

  initialize: ->
    @collection.on('reset', @render, this)

  render: ->
    Raffler.entries = @collection
    $(@el).html(@template(eventSource: (start, end, callback) ->
      console.log @collection # = undefined
      callback(Raffler.entries.events(start, end))
    ))

Мне пришлось присвоить свойству window.Raffler мою коллекцию, чтобы иметь возможность использовать его в обратном вызове. Есть ли хороший способ использовать что-то вроде callback(@collection.events(start, end))?

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

В coffeescript, если вы используете оператор "жирная стрелка" (=>) вместо ->, ваша функция обратного вызова будет привязана к this (@) в области, в которой она создается,Это означает, что вы можете использовать @collection в вашем обратном вызове, а @ будет правильно ссылаться на ваш EntriesIndex, поэтому ваша функция рендеринга может выглядеть так:

render: ->
  $(@el).html(@template(eventSource: (start, end, callback) =>
    console.log @collection # == your EntriesIndex collection
    callback(@collection.events(start, end))
  ))

См. http://coffeescript.org/#fat_arrow

Мое предложениеПриведенное выше будет работать только в том случае, если this (@) ссылается на ваш EntriesIndex в рамках рендера, поэтому я полагаю, что вам, возможно, придется сделать то же, что предложил Авраам, и обязательно связать @ с вашим EntriesIndex в функции рендеринга.Добавьте это для инициализации:

_.bindAll this

Кто-то, кто знает Coffeescript, может исправить меня, если я ошибаюсь в этом синтаксисе:)

1 голос
/ 02 апреля 2012

Внутри initialize, если вы this.bindAll(this);, тогда this.collection должно работать внутри render.

...