3

underscore/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(コーヒースクリプトではない)ソリューションをいただければ幸いです。

4

1 に答える 1

10

バックボーンが 、 などの動作に混在しているため、ラッピングは失敗します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 に答える