Marionette: 如何在AppRouter中使用多个控制器?
Marionette: how to use multiple controllers in AppRouter?
这将是一个重复的问题,但我无法找到任何关于如何在 AppRouter 中使用多个控制器的实际答案,例如在我的代码中我正在尝试的是:
define([
'marionette',
'apps/contents/workpackage/workpackage_controller',
'apps/contents/overview/overview_controller',
], function(
Marionette,
WorkpackageController
OverviewController
) {
return Marionette.AppRouter.extend({
initialize: function(options) {
this.wpcontroller = new WorkpackageController({region: options.region});
this.ovcontroller = new OverviewController({region: options.region});
},
appRoutes: {
'wp1': 'wpcontroller#workPackageContents1', //Workpackage Controller
'overview': 'ovcontroller #overviewcontent' //Overview Controller
}
});
});
好吧,您可能已经知道,AppRouter 不需要多个控制器。但这并不意味着您不能模块化您的控制器对象。我的意思是您可以将多个控制器对象连接在一起。在此示例中,请注意我的控制器是符合 v2.4.4 规范的普通对象(参见 docs)。 (如果你想要一些 Marionette 功能,你可以简单地在一个控制器上使用 Marionette.Object
并按照下面的方法操作。)
普通 JS 对象
因此,如果控制器定义为:
var workpackageController = {
workPackageContents1: function () {
// method logic //
}
}
另一个:
var overviewController = {
overviewcontent: function () {
// method logic //
}
}
然后我将像这样实例化我的 AppRouter:
return Marionette.AppRouter.extend(
appRoutes: {
'wp1': 'workPackageContents1', //Workpackage Controller
'overview': 'overviewcontent' //Overview Controller
},
controller: _.extend(workpackageController, overviewController)
});
我正在使用下划线的 _.extend()
将我的控制器对象的属性合并到 Marionette.AppRouter
可以摄取的一个对象中。这意味着独立控制器对象中的方法必须具有唯一的名称,否则将发生名称冲突。也就是说,您失去了以前独立对象的命名空间。
考虑到您仍在使用一个控制器对象,这可能对您有用,也可能不起作用。但是,它确实允许您整理控制器对象。
和Marionette.Object
如果您决定使用 Marionette.Object,只需将 _.extend()
中第一个对象的定义更改为:
var WorkpackageController = Marionette.Object.extend({
workPackageContents1: function () {
// method logic //
}
})
你的 _.extend()
现在看起来像:
_.extend(new WorkpackageController, overviewController);
其中 overviewController
仍然是您用来向 WorkpackageController 添加更多方法的普通对象。
您可以创建两个(或多个路由器实例,每个实例都有自己的控制器):
var WorkpackageRouter = Marionette.AppRouter.extend({
appRoutes: {
'wp1': 'workPackageContents1'
},
controller: new WorkpackageController({region: options.region});
});
var OverviewRouter = Marionette.AppRouter.extend({
appRoutes: {
'overview': 'overviewcontent'
},
controller: new OverviewController({region: options.region});
});
//later
var router1 = new OverviewRouter();
var router2 = new WorkpackageRouter();
Backbone.history.start();
这将是一个重复的问题,但我无法找到任何关于如何在 AppRouter 中使用多个控制器的实际答案,例如在我的代码中我正在尝试的是:
define([
'marionette',
'apps/contents/workpackage/workpackage_controller',
'apps/contents/overview/overview_controller',
], function(
Marionette,
WorkpackageController
OverviewController
) {
return Marionette.AppRouter.extend({
initialize: function(options) {
this.wpcontroller = new WorkpackageController({region: options.region});
this.ovcontroller = new OverviewController({region: options.region});
},
appRoutes: {
'wp1': 'wpcontroller#workPackageContents1', //Workpackage Controller
'overview': 'ovcontroller #overviewcontent' //Overview Controller
}
});
});
好吧,您可能已经知道,AppRouter 不需要多个控制器。但这并不意味着您不能模块化您的控制器对象。我的意思是您可以将多个控制器对象连接在一起。在此示例中,请注意我的控制器是符合 v2.4.4 规范的普通对象(参见 docs)。 (如果你想要一些 Marionette 功能,你可以简单地在一个控制器上使用 Marionette.Object
并按照下面的方法操作。)
普通 JS 对象
因此,如果控制器定义为:
var workpackageController = {
workPackageContents1: function () {
// method logic //
}
}
另一个:
var overviewController = {
overviewcontent: function () {
// method logic //
}
}
然后我将像这样实例化我的 AppRouter:
return Marionette.AppRouter.extend(
appRoutes: {
'wp1': 'workPackageContents1', //Workpackage Controller
'overview': 'overviewcontent' //Overview Controller
},
controller: _.extend(workpackageController, overviewController)
});
我正在使用下划线的 _.extend()
将我的控制器对象的属性合并到 Marionette.AppRouter
可以摄取的一个对象中。这意味着独立控制器对象中的方法必须具有唯一的名称,否则将发生名称冲突。也就是说,您失去了以前独立对象的命名空间。
考虑到您仍在使用一个控制器对象,这可能对您有用,也可能不起作用。但是,它确实允许您整理控制器对象。
和Marionette.Object
如果您决定使用 Marionette.Object,只需将 _.extend()
中第一个对象的定义更改为:
var WorkpackageController = Marionette.Object.extend({
workPackageContents1: function () {
// method logic //
}
})
你的 _.extend()
现在看起来像:
_.extend(new WorkpackageController, overviewController);
其中 overviewController
仍然是您用来向 WorkpackageController 添加更多方法的普通对象。
您可以创建两个(或多个路由器实例,每个实例都有自己的控制器):
var WorkpackageRouter = Marionette.AppRouter.extend({
appRoutes: {
'wp1': 'workPackageContents1'
},
controller: new WorkpackageController({region: options.region});
});
var OverviewRouter = Marionette.AppRouter.extend({
appRoutes: {
'overview': 'overviewcontent'
},
controller: new OverviewController({region: options.region});
});
//later
var router1 = new OverviewRouter();
var router2 = new WorkpackageRouter();
Backbone.history.start();