0

我試圖看看是否有辦法將start,stop,before:start事件自動綁定到所有已初始化的模塊,而無需向每個模塊添加this.on('start',function() {})樣板。Backbone.js/Marionette.js全局模塊事件綁定...?

我只是在做通過這些功能的一些基本的日誌/調試幫助我理解我的基礎好一點,這將是冷靜,如果我可以定義類似於如何來推翻原型被覆蓋的事件。

的「樣板」的類型的實施例我在添加完成這樣一個看似簡單的任務。 顯然,這是在咖啡...

@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()功能,並把事件綁定在那裏?不知道我會怎麼做,雖然...: -/

如何將一個做到這一點?

回答

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', ...); 
}; 

然後再次,你必須重新綁定原型和靜態方法。

編輯:
關於rebindings:

// 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); 
+0

所以,你說這是一個可行的解決我的問題,或者我應該試試別的? 後'module.apply' 然後我可以做一些像_.extend(這個,模塊) – 2013-04-08 15:24:15

+1

你可以做任何你想做的事情,只要確保你不干擾Backbone(或Marionette's)的內部東西。但只要你做正確的事(見我的約rebindings評論),這不能傷害(尤其是如果你只使用這個作爲開發工具)。 – Loamhoof 2013-04-08 15:26:21

+0

謝謝,這是非常有用的,我已經得到它的工作。 – 2013-04-08 15:47:40