3

我有一个下划线/主干/需要应用程序,我想将通过主干触发的所有事件输出到控制台(换句话说:通过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(不是coffeescript)解决方案。

4

1 回答 1

10

您的包装失败,因为 Backbone 混合了 , 等上的行为Backbone.Events。例如,定义为Backbone.ModelBackbone.CollectionBackbone.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/

于 2013-06-05T15:00:50.840 回答