2012-04-01 4 views
0

Вот вид я работаю с:Rendering просмотров Магистральные с коллекцией в обратных вызовов

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))?

ответ

1

В 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 (@) относится к вашим записям IndexIndex внутри рендеринга, поэтому я считаю, что вам, возможно, придется сделать то же самое, что предложил Авраам, и обязательно привяжите @ к вашим записям в функции рендеринга. Добавить для инициализации:

_.bindAll this 

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

1

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