processAppRoutes for Maionette AppRouter 不是一个函数

processAppRoutes for Maionette AppRouter isn't a function

本文关键字:一个 函数 for Maionette AppRouter processAppRoutes      更新时间:2023-09-26

在我的应用程序中,我有一个全局触发器,可以在路由器上调用navigate,它基本上允许我编写普通链接并触发骨干路由方法。

无论如何,我正在尝试将我的路由器分解为较小的路由器对象,然后将它们组合成一个主路由器,我可以在该主路由器上触发navigate方法,而无需知道我正在尝试与哪个子路由器通信。

我已经创建了一些控制器,并尝试使用此处描述的processAppRoutes方法将它们传递给我的AppRouter对象,但我不断收到它不是函数的消息。我已经检查了我的版本是否是最新的,我可以在源代码中看到方法定义,但我似乎无法调用它。

正在使用requirejs,所以我将发布一个示例,说明我如何构建我的尝试,为了简洁起见,简化为相关部分。

users.controller.js:

return Marionette.Controller.extend({
    routes: {
        'users/login': 'login'
    },
    login: function(){
        ...
    }
});

路线.js:

var UsersController = require('users.controller');
var router = new Marionette.AppRouter.extend();
router.processAppRoutes(UsersController, UsersController.routes);

我将路由作为控制器的对象包含在内,以便在使用 requirejs 返回控制器时使它们可用,所以这就是它存在的原因。

基本上,我的问题是:如何将路由器定义为单独的对象,然后将它们组合成整个应用程序的单个路由器?

这是我最终所做的:

routes/routes.js:(返回一个 AppRouter 对象,然后可以作为木偶应用中唯一的 AppRouter 运行)

var Controllers = {
    Events: require('events/events.controller'),
    Users: require('users/users.controller')
};
var routes = {};
var MyAppController = {};
$.each(Controllers, function(key, controller){
    var c = new controller();
    routes = _.extend(routes, c.routes);
    MyAppController = _.extend(MyAppController, c);
});
var MyAppRouter = Marionette.AppRouter.extend({
    controller: MyAppController,
    appRoutes: routes       
});
return MyAppRouter;
events

/events.controller.js:(只是一个片段)

var EventsController = Marionette.Controller.extend({
    routes: {
        '': 'showEvents',
        'events/add': 'addEvents'
    },
    showEvents: function(){ ... },
    addEvents: function(){ ... }
});

事实证明,我只能在 AppRouter 上运行 processAppRoutes() 之前,它被 new 实例化,而且只有一次。通过在控制器中定义一个不由控制器使用的路由对象,我可以在routes.js文件中访问它,并循环访问路由和方法,以创建一个包含整个应用程序的所有路由的 AppRouter 对象。添加新控制器就像要求它在 Controllers 对象中一样简单。