Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 主干控制台日志事件触发_Events_Backbone.js_Triggers_Console - Fatal编程技术网

Events 主干控制台日志事件触发

Events 主干控制台日志事件触发,events,backbone.js,triggers,console,Events,Backbone.js,Triggers,Console,我有一个下划线/主干/require应用程序,我想将通过主干触发的所有事件输出到控制台(换句话说:通过console.log函数传递每个事件)。我尝试过用下划线包装它,并手动替换该函数。这两者都不是: console.log(Backbone.Events.trigger); var trigger = Backbone.Events.trigger; Backbone.Events.trigger = function(name) { console.log('Event', name

我有一个下划线/主干/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(而不是coffeescript)解决方案。

您的包装失败,因为主干混入了
Backbone.Model
Backbone.Collection
,等等上的
Backbone.Model
行为。例如,
Backbone.Model
定义为

var Model = Backbone.Model = function(attributes, options) {
    ...
};
_.extend(Model.prototype, Events, {
    ...
};
这意味着当您重新定义主干.Events.trigger时,已经太晚了

但一切都没有失去!您无法一次性重新定义所有
trigger
方法,但可以在类级别重新定义它们:

Backbone.Model.prototype.trigger = function() {
    console.log('Event', arguments);
    Backbone.Events.trigger.apply(this, arguments);
}
还有一个演示

对于给定的类,可以重写触发器方法:

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

或者对于给定的实例

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

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

这正是我需要的,谢谢!我可以看到,如果我从API获取模型,所有模型的所有字段都会发送事件。有没有办法将这样的东西附加到选定的主干模型中?@tkoomzaaskz我添加了一些示例来限制类或实例的行为。