Marionette 路由器没有在路由上触发控制器方法

Marionette router not triggering controller method on route

我正在尝试从 Marionette 1.* > 2.4.2 升级应用程序。此更改的最大部分是从 Marionette 模块转变为使用 Browserify/Watchify CommonJS 样式模块。

我在尝试 Router/Controller 和 运行 时遇到了障碍。没有抛出错误,但由于某些原因,我的路由没有触发我的控制器方法。

doc_router.js:

var $ = require('jquery')
    , _ = require("underscore")
    , Backbone = require("backbone")
    , Marionette = require("backbone.marionette")
    , App = require("../../app.js")

var Router = Marionette.AppRouter.extend({

    appRoutes: {
        "docs": "listDocs"
    }
});

// Map to controllers

var API = {

    listDocs: function () {
        console.log("listDocs") // Doesnt log to console
        App.DocApp.List.Controller.listDocs();
    }
};

// Update the URL when a controller event
// that requires it is triggered, then call
// appropriate controller via API.

App.on("docs:list", function () {
    App.navigate("docs");
    API.listDocs();
});


// Initialize router when app starts

App.on("before:start", function () {
    console.log("History started? ", Backbone.History.started);
    console.log("Initializing router...")
    new Router({
        controller: API
    });
});

module.exports = Router;

app.js:

var $ = require('jquery')
    , _ = require("underscore")
    , Backbone = require("backbone")
    , Marionette = require("backbone.marionette")


var App = new Marionette.Application();

App.addRegions({ 
    mainRegion  : "#main-region",
    modalRegion : "#modal-region"
});

App.on("start", function () {
    if (Backbone.history) {
        console.log("Application starting...");
        var fetchingCurrentUser = App.request("entities:current-user");

        $.when(fetchingCurrentUser).done(function (current_user) {
            App.currentUser = current_user;
            console.log("Starting history...");
            Backbone.history.start();

            console.log("History started? ", Backbone.History.started);
        }); 
    }
});

module.exports = App

main.js:

var _ = require('underscore');
var App = require('./app.js');

App.Entities = _.extend({}, 
    require("./entities/doc.js"), 
    require("./entities/user.js")
);

// DocsApp
App.DocsApp = {
    "Router": require("./apps/doc/doc_router.js"),
    "Reader": {
        "Controller": require("./apps/doc/reader/doc-reader_controller.js"),
        "Views": require("./apps/doc/reader/doc-reader_views.js")
    },
    "List": {
        "Controller": require("./apps/doc/list/doc-list_controller.js"),
        "Views": require("./apps/doc/list/doc-list_views.js")
    }
};

App.start();

从我的控制台日志来看,我似乎没有在创建路由器之前启动 Backbone.history。真的把我的头发拉到这个......任何帮助表示赞赏。

编辑

使用 Backbone.Router 似乎有效(如下)。为什么 Marionette.AppRouter 不起作用?

var Router = Backbone.Router.extend({

    routes: {
        "": "listDocs",
        "docs": "listDocs",
        "docs/:doc_id" : "readDoc",
        "docs/:doc_id/edit" : "editDoc"
    },

    listDocs: function () {
        console.log("listDocs") // Logs to console
        // App.DocApp.List.Controller.listDocs();
    }
});

Marionette扩展了Backbone的内置路由,所以如果你想让router.navigate触发路由功能,you'll have to pass the option trigger like this:

router.navigate('docs', {trigger: true});

最终切换到 backbone.base-router,这让我可以指定一个控制器,因为 Marionette AppRouter 显然与 Browserify 有问题。