我是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中查找路由器功能?
答案 0 :(得分:0)
建议您将控制器对象划分为较小的相关功能部件,并使用多个路由器/控制器,而不只是一个巨型路由器和控制器。
这样做:
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,但它并不起作用。