0

すべてのモジュールにボイラープレートを追加することなく、初期化されたすべてのモジュールにstart, stop,イベントを自動的にバインドする方法があるかどうかを確認しようとしています。before:startthis.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()、そこにイベント バインディングを配置することでした。どうやってそれを行うのかわかりません... :-/

どうすればこれを達成できますか?

4

1 に答える 1

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);
于 2013-04-08T14:59:36.940 に答える