Магистральные маршрутизаторы: дождитесь, пока будут получены данные сначала

Я думаю, что не совсем понимаю правильное использование маршрутизаторов Backbone . Вот что у меня есть:

У меня есть некоторые данные, которые я беру с сервера при загрузке страницы и затем упаковываю в модели и коллекции. Количество этих моделей и коллекций неограниченно. Я хочу использовать маршрутизатор, чтобы иметь возможность отображать представление определенной коллекции непосредственно с самого начала.

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

Я не знаю, правильный ли это способ сделать это, но я пришел к единственной идее:

  1. Обернуть определение маршрутов и Backbone.history.start (); в отдельную функцию верхнего уровня (т.е. подготовьте ее к вызову вручную позже).
  2. Запустить эту функцию в качестве обратного вызова success для моей коллекции fetch ()
  3. Число этих коллекций неизвестно, также у меня нет возможности узнать, когда все они были получен, и я не хочу запускать маршруты более одного раза. Поэтому я использую _. 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);
        }});

    },

});

Итак, мой вопрос… правильно ли я делаю? Или есть лучший способ сделать это (должен быть)?

11
задан Arnold 19 October 2011 в 14:14
поделиться