Javascript 木偶控制器对象,创建动态原型方法?
我正在为一个有很多页面的应用程序使用木偶。控制器/路由器方法是重复的,在每个方法中,视图被实例化,appRegion显示视图 我想在循环中创建方法Javascript 木偶控制器对象,创建动态原型方法?,javascript,backbone.js,prototype,marionette,Javascript,Backbone.js,Prototype,Marionette,我正在为一个有很多页面的应用程序使用木偶。控制器/路由器方法是重复的,在每个方法中,视图被实例化,appRegion显示视图 我想在循环中创建方法 var Controller = Marionette.Controller.extend({}); for(i=0;i<10;i++) { // build dynamic controller methods } 我的问题是上面的模块,我如何完成它,我可以在循环中添加新方法吗?有没有办法简化这个重复的任务,一遍遍地添加相同的代码?<
var Controller = Marionette.Controller.extend({});
for(i=0;i<10;i++) {
// build dynamic controller methods
}
我的问题是上面的模块,我如何完成它,我可以在循环中添加新方法吗?有没有办法简化这个重复的任务,一遍遍地添加相同的代码?< p>如果你的目标是定义一个对象中的页面设置,然后动态地生成路由和控制器函数,考虑如下:
var app = new Backbone.Marionette.Application();
app.addRegions({
mainRegion: "#main"
});
// Sample custom view
var view = Marionette.ItemView.extend({custom: 'properties'});
// Main config object
var pages = {
"page/a": {view: view, msg: "route a!", controllerFunc: "pageA", templateSelector: "#pageA"},
"page/b": {view: view, msg: "route b!", controllerFunc: "pageB", templateSelector: "#pageB"},
"page/c": {view: view, msg: "route c!", controllerFunc: "pageC", templateSelector: "#pageC"}
};
var controller = {}; // Marionette.Controller is deprecated, just use a plain js object.
var routes = {};
// Populate controller and routes via routeConfigs
_.each(pages, function (page, route, list){
// An IIFE, read more on http://en.wikipedia.org/wiki/Immediately-invoked_function_expression
// Return a function
controller[page.controllerFunc] = (function(page){
return function() {
// Instantiate a new view based on the template selector
app.mainRegion.show(new (page.view)({template: page.templateSelector}));
// A log just to demonstrate what you can do with the other attributes.
console.log('Message = ', page.msg);
};
})(page);
// Populate routes too
routes[route] = page.controllerFunc;
});
// The actual appRouter
var router = new Marionette.AppRouter({
controller: controller,
appRoutes: routes
});
app.start();
Backbone.history.start();
// Test route B
Backbone.history.navigate('page/b', true);
JSFIDLE供您玩 另一种方法是使用函数来保存常用操作
var app = new Backbone.Marionette.Application();
app.addRegions({
mainRegion: "#main"
});
// Sample custom view
var view = Marionette.ItemView.extend({custom: 'properties'});
// Main config object
var pages = {
"page/a": {view: view, msg: "route a!", controllerFunc: "pageA", templateSelector: "#pageA"},
"page/b": {view: view, msg: "route b!", controllerFunc: "pageB", templateSelector: "#pageB"},
"page/c": {view: view, msg: "route c!", controllerFunc: "pageC", templateSelector: "#pageC"}
};
// Marionette.Controller is deprecated, just use a plain js object.
var controller = {
baseAction: function (config){
// View options
var viewOptions = {template: config.templateSelector};
// Instantiate a new view based on the template selector
app.mainRegion.show(new (config.view)(viewOptions));
// A log to check the values
console.log('config = ', config);
}
};
var routes = {};
// Populate controller and routes via routeConfigs
_.each(pages, function (page, route, list){
// Return a function
controller[page.controllerFunc] = (function(page){
// An IIFE, read more on http://en.wikipedia.org/wiki/Immediately-invoked_function_expression
return function() {
controller.baseAction(page);
};
})(page);
// Populate routes too
routes[route] = page.controllerFunc;
});
// The actual appRouter
var router = new Marionette.AppRouter({
controller: controller,
appRoutes: routes
});
app.start();
Backbone.history.start();
// Test route A
Backbone.history.navigate('page/a', true);
jsfiddle:我认为你的思路完全正确。我还认为,这里实际上有两个问题。您概述了第一种和第二种方法,即动态创建并提供到
路由器的路由
设置控制器
查看方法和路由器
我正在考虑修改您的参考页面
对象,如下所示:
var pages = [
{'pageButtons': Buttons, route: 'buttons'},
{'pageLogin': Login, route: 'login'}
];
接下来,我们声明控制器并添加动态方法
var Controller = Marionette.Controller.extend({}),
Router = Marionette.AppRouter.extend({});
for(var page in pages) {
for(var method in pages[page]) {
// Each method will be have a pointer in
// Controller.pagemethod, e.g. Controller.pageButtonsButtons
Controller[page + method] = pages[page][method];
// And now we set up the Router
// e.g. a url of http://appdomain#pagesButton will map to
// a method with name 'pageButtonsButtons'
Router[page] = page + method;
}
}
当然,天空是你定制“方法工厂”的极限。在引用页面对象中添加的属性越多,您的工厂就越具体
我还想注意,这里我们并没有将方法添加到控制器的原型中,只是为了简单起见。我认为我们可以在这里解决这个问题,因为通常Controller
s只实例化一次,我们不一定需要通过扩展原型来提高生产率。但是,如果你这样做,功能上并没有什么不同。只是好奇,你最终做了什么?我已经好几天没有检查过了,所以我认为这个问题已经失败了。很酷的人,看起来很棒,让我试试看,把它弄得乱七八糟,我认为这应该简化过程,否则可能会让它更混乱,谁知道,值得一试!
var Controller = Marionette.Controller.extend({}),
Router = Marionette.AppRouter.extend({});
for(var page in pages) {
for(var method in pages[page]) {
// Each method will be have a pointer in
// Controller.pagemethod, e.g. Controller.pageButtonsButtons
Controller[page + method] = pages[page][method];
// And now we set up the Router
// e.g. a url of http://appdomain#pagesButton will map to
// a method with name 'pageButtonsButtons'
Router[page] = page + method;
}
}