Javascript 木偶控制器对象,创建动态原型方法?

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 } 我的问题是上面的模块,我如何完成它,我可以在循环中添加新方法吗?有没有办法简化这个重复的任务,一遍遍地添加相同的代码?<

我正在为一个有很多页面的应用程序使用木偶。控制器/路由器方法是重复的,在每个方法中,视图被实例化,appRegion显示视图

我想在循环中创建方法

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;
  }
}