Магистральная Марионетка не стреляет маршрутами

1

Я создаю простое приложение, использующее Backbone и Marionette. Это просто, чтобы получить список сообщений Wordpress (используя API) и отобразить его. Это очень простое приложение, поэтому оно не является модульным.

У меня есть следующее (все это помещено в один файл):

if ( Backbone.history )
    Backbone.history.start({ pushState: false });

if ( Backbone.history.fragment === '' )
    API.listAllPosts();
else
    API.listSinglePost( Backbone.history.fragment );


// Is not firing anything from here...
MyBlog.Router =  Marionette.AppRouter.extend({
    appRoutes: {
        '': 'listPosts',
        ':post_name': 'listSingle'
    },
    listPosts: function() {
        console.log('router');
        API.listAllPosts();
    },
    listSingle: function(model) {
        console.log('router, single');
        API.listSinglePost(model);
    }
});
// ...to here

var API = {
    listAllPosts: function() {
        // Fetch all posts and display it. It working
    },
    listSinglePost: function(model) {
        // Fetch a single post and display it. It working
    }
}

MyBlog.addInitializer(function() {
    console.log('initializer'); // It firing

    new MyBlog.Router({
        controller: API
    });
});

Как сказал разработчик Marionette Дерик Бэйли, об использовании триггеров на naviagate:

это поощряет плохой дизайн приложения, и настоятельно рекомендуется, чтобы вы не проходили trigger:true для Backbone.history.navigate.

Что мне здесь не хватает?

Теги:
marionette
backbone.js

2 ответа

0
Лучший ответ

Перед созданием экземпляра маршрутизатора вы запускаете историю магистрали.

Просто переместите это, чтобы после создания маршрутизатора.

MyBlog.addInitializer(function() {    
    new MyBlog.Router({ controller: API });

    // should be started after a router has been created
    Backbone.history.start({ pushState: false });
});

Другое дело, что обратные вызовы должны быть определены внутри контроллера или вы должны изменить appRoutes на routes.

Основное различие между appRoutes и routes заключается в том, что мы предоставляем обратные вызовы на контроллере, а не непосредственно на маршрутизаторе. [...] Поскольку AppRouter расширяет Backbone.Router, вы также можете определить атрибут routes чьи обратные вызовы должны присутствовать в AppRouter.

  • 1
    Спасибо @ Эмиль Бержерон! Это навигация назад и отображение моего списка сообщений. Проблема была в использовании appRoutes вместо маршрутов и в способе, которым я их вызывал. Спасибо всем за продвижение!
0

Переместите это

if ( Backbone.history )
    Backbone.history.start({ pushState: false });

if ( Backbone.history.fragment === '' )
    API.listAllPosts();
else
    API.listSinglePost( Backbone.history.fragment );

после того, как ваше приложение запускается или внутри initialize:after обработчика события.

Проверьте этот предыдущий вопрос: Marionette.js appRouter не запускается при запуске приложения

  • 0
    Я пытался, но ... не повезло.
  • 0
    Вы используете хэш ( # ) в href ваших ссылок?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню