2013-12-13 3 views
0

Попробую и упрощать это как можно больше ..Backbone.js - Fetch() не вызывается из моего маршрутизатора

Моего routes.js:

direct_message: function(member_id) { 

    list.conversations(function(conversations) { 
    conversation_view.model = conversations.models[conversations.models.length - 1]; 
    conversation_view.render(); 
    }); 

ИТАК conversations() является функция внутри моей модели списка, которая имеет удобный метод fetch() и обратный вызов (который является методом, который я передаю ему). Он проверяет, чтобы увидеть, если вещи были неправдоподобными, и если да, то возвращает обратный вызов с надуманными параметрами .. Как так:

conversations: function(callback) { 
    var _callback = _.bind(function() { if(callback) callback(this._conversations); }, this); 
    if(!this._conversations) { 
    this._conversations = new app.collections.Conversations(); 
    this._conversations.url = this._url(); 
    app.events.on('pusher:conversation_started', this._conversation_started, this); 
    } 
    if(this._conversations._fetched) { 
    _callback(); 
    } else { 
    this._conversations.on('reset', _callback); 
    if(!this._conversations._fetching) { 
     this._conversations._fetching = true; 
     this._conversations.fetch({ 
     success: function(c) { c._fetched = true; }, 
     error: function(c) { c._fetching = false; } 
     }); 
    } 
    } 
    return this._conversations; 
}, 

Уф! Надеюсь, я еще не потерял тебя. Так что это каскадировало все хорошо и правильно на некоторое время. Но теперь, по какой-то причине, когда я выполняю этот метод в своем routes.js, он возвращается обратно как undefined.

Причина, по которой я думаю, что это происходит, заключается в том, что запрос на выбор является асинхронным. Таким образом, возврат возвращается правильно, но оператор return вызывается перед возвратом данных. Таким образом, все остальные вызовы conversation() действительно корректно возвращаются, за исключением первого, который его инициализировал.

Тогда я думал, позвольте мне добавить async: false к вызову fetch(), но когда я это сделаю, по какой-то причине последующие звонки возвращаются undefined. Есть что-нибудь еще я могу сделать? Может, что-то еще я должен смотреть? Возможно, каким-то образом включить в него объекты $ .deferred?

Большое спасибо!

ответ

1

Насколько я могу судить, вы не должны return this._conversations, но всегда получаете доступ к this._conversations через обратный вызов, независимо от того, произошла ли выборка или нет.

Вы можете сделать это, изменив обработчик успеха выборки, чтобы прочитать: -

success: function(c) { 
    c._fetched = true; 
    _callback(); 
}, 

и (если вы абсолютно не нужно) удалить строку: -

return this._conversations; 

Это, по крайней мере убедиться, что , когда обратный вызов передается, вы получаете то же поведение при первом и последующих вызовах.

+0

Ничего себе, я не могу поверить, что не думал об этом. Большое спасибо Beetroot-Beetroot! (Я на самом деле пил свеклу прямо сейчас) – Trip

+1

«Пить свечку» - странно это то, чего я никогда не делал - слишком много, как людоедство, я полагаю. –

1

В Backbone 1.1 fetch() больше не срабатывает событие reset по умолчанию. Либо перейдите reset: true в fetch() вызов или (рекомендуется), прислушайтесь к событию sync.

Смежные вопросы