BeforeSend передается в метод Backbone's Fetch, не позволяющий запускать события - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть коллекция Backbone.Я использую fetch для отложенной загрузки сообщений Facebook в модель при инициализации.

https://gist.github.com/2271437

exports.Collection = class Posts extends Backbone.Collection
  initialize: (models, options) =>
    @id = options.id
    @activeDetails = false
    @on "loadDetails", @loadDetails
    @on "detailsLoaded", @logger
    debug "initialized posts"
    @fetch
      beforeSend: () =>
        console.log "about to fetch..."
        @trigger "postsLoading"
      success: (collection, response) => 
        debug "successfully loaded ajax"
        @trigger "postsLoaded"
      error: (collection, response) => @trigger "postsLoadingError"

По какой-то странной причине, когда я пытаюсь вызвать события, используя beforeSend обработчик, события не срабатывают.Я могу вызывать любые функции, но если какие-либо функции пытаются использовать @trigger "eventName", событие никогда не запускается так, как я мог наблюдать.В приведенном выше примере функция console.log работает просто отлично, но триггер не работает.

Есть идеи?Обработчики успеха и ошибок работают великолепно.

1 Ответ

2 голосов
/ 01 апреля 2012

Вы вызываете fetch внутри вашего initialize метода, поэтому ничто не сможет связать эту коллекцию до того, как будут инициированы события.Метод initialize вызывается во время создания экземпляра вашей коллекции, и это означает, что вы вызываете fetch до того, как конструктор вернется, но вам нужен экземпляр коллекции, прежде чем вы сможете связываться с его событиями.

Рассмотрим что-то, похожее на это:

class Posts extends Backbone.Collection
  do_things: ->
    @fetch
      beforeSend: () =>
        console.log "about to fetch..."
        @trigger "postsLoading"
      success: (collection, response) => 
        debug "successfully loaded ajax"
        @trigger "postsLoaded"
      error: (collection, response) => @trigger "postsLoadingError"

Тогда, если вы сделаете это:

p = new Posts
p.on('postsLoading', -> console.log('loading'))     
p.do_things()

, вы увидите, что ваше событие postsLoading действительно инициировано.

Демонстрация: http://jsfiddle.net/ambiguous/PDeFg/

Мораль этой истории проста:

Не вызывайте fetch внутри вашего конструктора, если вам небезразличны слушатели событий.

...