我希望有这样的工作:
var Events=require('events'),
test=new Events.EventEmitter,
scope={
prop:true
};
test.on('event',function() {
console.log(this.prop===true);//would log true
});
test.emit.call(scope,'event');
但是,不幸的是,听众甚至没有被召唤。有没有办法做这个W / EventEmitter?我可以Function.bind
给听众,但是,我真的希望EventEmitter
有一些特殊的(或明显的)方法来做到这一点......
感谢您的帮助!
答案 0 :(得分:11)
不,因为侦听器中的this
值是事件发射器对象。
但是你能做的就是这个
var scope = {
...
};
scope._events = test._events;
test.emit.call(scope, ...);
您的事件处理程序未被调用的原因是因为所有处理程序都存储在._events
中,因此如果您将._events
复制到它上面就应该有效。
答案 1 :(得分:2)
这不起作用,只有传递参数的方便方法,但是没有用于设置this
的方法。看起来你必须自己做绑定的东西。但是,您可以将其作为参数传递:
test.on('event',function(self) {
console.log(self.prop===true);//would log true
});
test.emit('event', scope);
答案 2 :(得分:0)
当Google在NPM中搜索处理此问题的软件包时,我发现了这篇文章:
var ScopedEventEmitter = require("scoped-event-emitter"),
myScope = {},
emitter = new ScopedEventEmitter(myScope);
emitter.on("foo", function() {
assert(this === myScope);
});
emitter.emit("foo");
完全披露,这是我写的一个包。我需要它,所以我可以有一个具有EventEmitter属性的对象,该属性为包含对象发出。 NPM包页面:https://www.npmjs.org/package/scoped-event-emitter