Javascript Backbone.js/Marionette.js全局模块事件绑定。。。?

Javascript Backbone.js/Marionette.js全局模块事件绑定。。。?,javascript,backbone.js,marionette,backbone-events,Javascript,Backbone.js,Marionette,Backbone Events,我正在尝试查看是否有一种方法可以自动将start、stop、before:start事件绑定到所有初始化的模块,而无需将this.on('start',function(){})样板添加到每个模块 我只是通过这些函数来做一些基本的日志记录/调试,以帮助我更好地理解我的基础设施,如果我能定义类似于重写原型的事件,那就太棒了 为了完成这样一项看似简单的任务,我必须添加“样板”类型的示例。 显然这是在咖啡里 @on "before:start", -> console.log "starti

我正在尝试查看是否有一种方法可以自动将
start
stop
before:start
事件绑定到所有初始化的模块,而无需将
this.on('start',function(){})
样板添加到每个模块

我只是通过这些函数来做一些基本的日志记录/调试,以帮助我更好地理解我的基础设施,如果我能定义类似于重写原型的事件,那就太棒了

为了完成这样一项看似简单的任务,我必须添加“样板”类型的示例。 显然这是在咖啡里

@on "before:start", ->
  console.log "starting: #{Self.moduleName}"
  return
@on "start", (defaults)->
  _init()
  console.log "started: #{Self.moduleName}"
  return
@on "stop", () ->
  console.log "stopped: #{Self.moduleName}"
  return

  _init = () ->
    return
我的第一个想法是以某种方式重写
MyApp.module()
函数,并将事件绑定放在其中?不知道我会怎么做…:-/


怎样才能做到这一点呢?

我会照你说的做。
您可以重写构造函数。但是如果你这样做,你必须非常小心,重新绑定任何静态方法和绑定到它的原型。基本上,你可以这样做:

var module = Marionette.Module;
Marionette.Module = function() {
  // this would be bound BEFORE anything else happens
  this.on('before:start', ...);

  module.apply(this, arguments);

  // this would be bound AFTER anything else happens
  this.on('before:start', ...);
};
然后,您必须在之后重新绑定原型和静态方法

编辑:
关于重新绑定:

// save the prototype and any static method (or value)
var protoProps = Marionette.Module.prototype;
// this is maybe only the extend function
var staticProps = {};
for(var prop in Marionette.Module) staticProps[prop] = Marionette.Module[prop];

// override the Module
var module = Marionette.Module;
Marionette.Module = function() {
  ...
};

// rebind
Marionette.Module.prototype = protoProps;
_.extend(Marionette.Module, staticProps);

那么,你是说这是解决我问题的可行方法,还是我应该尝试其他方法?在
module.apply
之后,我可以做一些类似于扩展(这个模块)的事情吗?你可以做任何你想做的事情,只要确保你没有干扰主干(或木偶)的内部内容。但只要你做得很好(请参阅我关于重新绑定的评论),这不会有什么坏处(特别是当你只是把它作为开发工具使用时)。