Я думаю, что я не совсем понимаю, как правильно использовать маршрутизаторы Backbone. Вот что я получил:
У меня есть некоторые данные, которые я извлекаю с сервера, когда страница загружается, а затем упаковывает ее в модели и коллекции. Количество этих моделей и коллекций является неопределенным. Я хочу использовать маршрутизатор, чтобы иметь возможность отображать представление определенных коллекций непосредственно с самого начала.
Проблема заключается в следующем: базовый маршрутизатор запускается раньше, и поскольку я прошу его получить доступ к определенному виду и вызвать его действие render
, он не сможет этого сделать, потому что эти представления еще не созданы. Это означает, что мне действительно нужно запустить мои маршруты после завершения выборки.
Я не знаю, подходит ли это для этого, но единственная идея, которую я придумал, заключается в следующем:
- Оберните определение маршрутов и бит
Backbone.history.start();
в отдельную функцию, доступную на верхнем уровне (например, подготовьтесь к ее вызову вручную позже). - Запустите эту функцию как обратный вызов
success
для моих коллекцийfetch()
- Количество этих коллекций неизвестно, также я не могу узнать, когда все они были извлечены, и я не хочу запускать маршруты более одного раза. Поэтому я использую
_.defer()
и_.once()
.
Это работает, но это выглядит очень странно:
Маршрутизаторы:
window.startRoutes = _.once(function() {
var AccountPage = Backbone.Router.extend({
routes: {
'set/:id': 'renderSet',
},
renderSet: function(setId) {
/** … **/
// Call the rendering method on the respective CardView
CardsViews[setId].render();
}
});
var AccountPageRouter = new AccountPage;
Backbone.history.start();
});
Коллекция:
window.CardsCollection = Backbone.Collection.extend({
model: Card,
initialize: function(params) {
/** … **/
// Get the initial data
this.fetch({success: function() {
_.defer(startRoutes);
}});
},
});
Итак, мой вопрос... я все правильно? Или есть лучший способ сделать это (должно быть)?