我正在尝试查看是否有办法将start
,stop
,before: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
函数并将事件绑定放在那里?虽然不确定我会怎么做...: - /
如何实现这一目标?
答案 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);