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

iyfjxgzm  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(201)

我想看看是否有一种方法可以自动将startstopbefore: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()函数,并将事件绑定在那里?虽然不确定我将如何做到这一点...:-/
如何做到这一点?

bwntbbo3

bwntbbo31#

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

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

相关问题