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

时间:2013-04-08 14:38:01

标签: javascript javascript-events backbone.js marionette backbone-events

我正在尝试查看是否有办法将startstopbefore:start事件自动绑定到所有已初始化的模块,而无需添加{{1}每个模块的样板文件。

我只是通过这些函数进行一些基本的日志记录/调试,以帮助我更好地理解我的基础架构,如果我能定义类似于覆盖原型的覆盖事件,那将会很酷。

我必须添加的“样板”类型的示例,以完成这样一个看似简单的任务。 显然这是咖啡......

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 函数并将事件绑定放在那里?虽然不确定我会怎么做...: - /

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

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

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