【问题标题】:Routes and controllers in Marionette.jsMarionette.js 中的路由和控制器
【发布时间】:2014-11-16 17:50:31
【问题描述】:

我是 Marionette.js 的新成员。我目前正在实施路线和控制器。在我的 App.js 中,我有:

    App.appRouter = new Router({
        controller:new AppController()
    });

我希望 AppController 初始化其他控制器。因此,我有一个 GenericController,它在哈希更改为“通用”时负责处理所有事情,NewsController 在哈希更改为“新闻”时负责处理所有事情等。我不想将所有路由功能都放在一个巨大的控制器文件中。所以我的 AppController 看起来像:

define(['App', 'backbone', 'marionette',
        "app/models/generic", "app/views/GenericList",
        'app/utils/useful_func', 'app/utils/pageslider',
        'constants',
        'app/controllers/GenericController'
        ],
    function (App, Backbone, Marionette,
        model, GenericList,
        Useful, PageSlider,
        constants,
        GenericController) {

    return Backbone.Marionette.Controller.extend({

        initialize:function (options) {

            genericController = new GenericController();

        },

    });

});

GenericController 看起来像:

define(['App', 'backbone', 'marionette'],
    function (App, Backbone, Marionette) {

    return Backbone.Marionette.Controller.extend({

        initialize:function (options) {

        },

        getGeneric: function(){
                console.log('in getGeneric');
        },

    });
});

路由器看起来像:

    appRoutes: {
        "generic": "getGeneric",
        ...

但是,我最终得到了错误:

Method 'getGenericItem' was not found on the controller 

因为它只是在 AppController 中查找,而不是在 GenericController 中查找路由器功能。

如果我将 getGenericItem() 移动到主 AppController,它可以正常工作。如何让它在 GenericController 中查找路由器功能?

【问题讨论】:

    标签: javascript backbone.js marionette


    【解决方案1】:

    Marionette docs:

    建议您将控制器对象划分为相关功能的小块,并拥有多个路由器/控制器,而不是只有一个巨大的路由器和控制器。

    这样做:

    var AppController =  Backbone.Marionette.Controller.extend({
      initialize:function (options) {
      },    
      customAction: function() {
        console.log('in customAction');
      }
    });
    
    var GenericController = Backbone.Marionette.Controller.extend({
      initialize:function (options) {    
      },    
      getGeneric: function(){
        console.log('in getGeneric');
      }    
    });
    
    App.appRouter = new Marionette.AppRouter({
      controller:new AppController(),        
      appRoutes: {
        "custom": "customAction"
      }
    });
    
    App.genericRouter = new Marionette.AppRouter({
      controller: new GenericController(),
      appRoutes: {
        "generic": "getGeneric"
      }
    });
    

    这是jsbin,但它不起作用。

    【讨论】:

    • NewsController 怎么样?我如何拥有多个子控制器?
    猜你喜欢
    • 2013-08-16
    • 2023-03-22
    • 2017-02-27
    • 2023-03-27
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多