Backbone - выполнение множественной выборки() перед визуализацией представления
Мне было интересно узнать о лучшем образце/подходе. Это функция в моем маршрутизаторе, поэтому пользователь нажимает "quotes/: id", но для этого представления для рендеринга мне нужен список их проектов, клиентов и валют. Какой был бы лучший способ убедиться, что все 3 выборки() произошли, прежде чем пытаться создать экземпляр представления quotesEdit
? Является ли плохая практика захватить всю информацию, когда пользователь что-то нажимает?
quotesEdit: function(id) {
kf.Collections.quotes = kf.Collections.quotes || new kf.Collections.Quotes();
kf.Collections.projects = kf.Collections.projects || new kf.Collections.Projects();
kf.Collections.currencies = kf.Collections.currencies || new kf.Collections.Currencies();
//do a fetch() for the 3 above
kf.Collections.customers = kf.Collections.customers || new kf.Collections.Customers();
var quote = kf.Collections.quotes.where({Id: parseInt(id, 10)});
kf.Utils.ViewManager.swap('sectionPrimary', new kf.Views.section({
section: 'quotesEdit',
model: quote[0]
}));
}
Ответы
Ответ 1
Я нахожу комбинацию jQuery отложенных и подчеркивание invoke
решает это элегантно:
//call fetch on the three collections, and keep their promises
var complete = _.invoke([quotes, projects, currencies], 'fetch');
//when all of them are complete...
$.when.apply($, complete).done(function() {
//all ready and good to go...
});
Ответ 2
Promises! В частности jQuery.when
Вы можете сделать что-то вроде этого:
$.when(
kf.Collections.quotes.fetch(),
kf.Collections.projects.fetch(),
kf.Collections.currencies.fetch()
).then(function(){
// render your view.
});
jQuery.ajax(и по умолчанию с помощью базовой линии) возвращает обещание, и вы можете использовать $.when
для установки функции обратного вызова после разрешения нескольких promises.
Ответ 3
Магистраль fetch
возвращает объект jQuery Deferred
(обещание). Таким образом, вы можете использовать jQuery когда функция ждет, пока все promises будут разрешены:
quotesEdit: function(id) {
kf.Collections.quotes = kf.Collections.quotes || new kf.Collections.Quotes();
kf.Collections.projects = kf.Collections.projects || new kf.Collections.Projects();
kf.Collections.currencies = kf.Collections.currencies || new kf.Collections.Currencies();
//do a fetch() for the 3 above
var quotePromise = kf.Collections.quotes.fetch();
var projectsPromise = kf.Collections.projects.fetch();
var currenciesPromise = kf.collections.currencies.fetch();
// wait for them to all return
$.when(quotePromise, projectsPromise, currenciesPromise).then(function(){
// do stuff here, now that all three have resolved / returned
kf.Collections.customers = kf.Collections.customers || new kf.Collections.Customers();
var quote = kf.Collections.quotes.where({Id: parseInt(id, 10)});
kf.Utils.ViewManager.swap('sectionPrimary', new kf.Views.section({
section: 'quotesEdit',
model: quote[0]
}));
};
}
Я немного написал о promises и jQuery, когда здесь:
http://lostechies.com/derickbailey/2012/03/27/providing-synchronous-asynchronous-flexibility-with-jquery-when/
http://lostechies.com/derickbailey/2012/07/19/want-to-build-win8winjs-apps-you-need-to-understand-promises/
что вторая ссылка все еще действительна, несмотря на то, что основным объектом является Win8 JS