2013-06-05 54 views
3

我有一個下劃線/ backbone/require應用程序,我想輸出所有通過骨幹網觸發的事件到控制檯(換句話說:通過console.log函數傳遞每個事件)。我試着用下劃線包起來並手動替換函數。無論是這樣的:骨幹控制檯日誌事件觸發

console.log(Backbone.Events.trigger); 
var trigger = Backbone.Events.trigger; 
Backbone.Events.trigger = function(name) { 
    console.log('Event', name, 'triggered.'); 
    trigger.apply(this, arguments); 
} 

也不是這:

Backbone.Events.trigger = _.wrap(Backbone.Events.trigger, function(func) { 
    console.log('EVENT:', Array.prototype.slice.call(arguments)); 
    func(Array.prototype.slice.call(arguments)); 
}); 
console.log(Backbone.Events.trigger); 

工作。我會欣賞一個JavaScript(不是咖啡標記)解決方案。

回答

10

你包裝紙失敗,因爲在骨幹行爲Backbone.EventsBackbone.ModelBackbone.Collection等。例如混合,Backbone.Model被定義爲

var Model = Backbone.Model = function(attributes, options) { 
    ... 
}; 
_.extend(Model.prototype, Events, { 
    ... 
}; 

這意味着,當你重新定義Backbone.Events.trigger,已經是爲時已晚。

但是一切都不會丟失!您將無法重新定義一個全力以赴trigger方法,但你可以重新定義它們的類層次:

Backbone.Model.prototype.trigger = function() { 
    console.log('Event', arguments); 
    Backbone.Events.trigger.apply(this, arguments); 
} 

和演示http://jsfiddle.net/nikoshr/G2Qfn/

對於一個給定類,則可以覆蓋觸發方法:

var M = Backbone.Model.extend({ 
    trigger: function() { 
     console.log('Event', arguments); 
     Backbone.Model.prototype.trigger.apply(this, arguments); 
    } 
}); 

http://jsfiddle.net/nikoshr/G2Qfn/1/

或給定實例

var M = Backbone.Model.extend({}); 

var m = new M(); 
m.trigger = function() { 
    console.log('Event', arguments); 
    M.prototype.trigger.apply(this, arguments); 
} 

http://jsfiddle.net/nikoshr/G2Qfn/2/

+0

這正是我需要的,謝謝!我可以看到,如果我從API獲取模型,則所有模型的所有字段都會發送事件。有沒有辦法將這樣的東西附加到選定的骨幹模型中? – ducin

+0

@tkoomzaaskz我添加了一些例子來限制一個類或一個實例的行爲。 – nikoshr