Ben*_*ynn 9 javascript google-closure
我想在谷歌闭包(GC)环境中使用事件在我的对象之间进行通信.
假设我有两个类foobar.Boss和foobar.Employee.老板想知道员工什么时候煮咖啡,以及咖啡是否是咖啡因(他本周正在解雇咖啡因).
GC提供的类似乎提供了执行此操作的方法,goog.events.Event并且goog.events.EventTarget.
如果不知道更好,我认为它会像这样工作:
foobar.Employee.prototype.makeCoffee = function(isDecaf)
{
this.coffeeMaker.putCoffeeInMachine(isDecaf);
this.coffeeMaker.start();
var event = new goog.event.Event('COFFEE_ON', { isDecaf: isDecaf });
goog.events.dispatchEvent(event);
}
foobar.Boss.prototype.addEmployee = function(employee)
{
...
goog.events.listen(employee, 'COFFEE_ON', function(e)
{
if (e.target.isDecaf)
{
this.refillMug();
}
}, false, this);
...
}
Run Code Online (Sandbox Code Playgroud)
这是正确的模式吗?我对课程感到困惑goog.events.EventTarget- 目标调度事件如何?目标不是有事情发生的吗?
这个问题很有帮助,但更直接的答案将不胜感激.
Ben*_*ynn 10
看了一会儿之后,我的理解是EventTarget,实际上它实际上是一个双重卷,即调度事件的实体和被收听的实体.所以一种选择是Employee继承,goog.events.EventTarget但我已经走了不同的路线.
首先,我创建了一个新的事件类型,让Boss知道咖啡是否是脱咖啡因.
/**
* @constructor
* @extends {goog.events.Event}
*/
foobar.CoffeeEvent = function(isDecaf)
{
goog.events.Event.call(this, 'COFFEE_ON');
this.isDecaf = isDecaf;
};
goog.inherits(foobar.CoffeeEvent, goog.events.Event);
Run Code Online (Sandbox Code Playgroud)
接下来,我创建了一个事件监听器类型来分派这些事件.
/**
* @constructor
* @extends {goog.events.EventTarget}
*/
foobar.CoffeeEventTarget = function()
{
goog.events.EventTarget.call(this);
};
goog.inherits(foobar.CoffeeEventTarget, goog.events.EventTarget);
Run Code Online (Sandbox Code Playgroud)
我向我添加了这种类型的对象Employee.
foobar.Employee = function()
{
...
this.coffeeEvents = new foobar.CoffeeEventTarget();
...
}
Run Code Online (Sandbox Code Playgroud)
当员工补充咖啡时:
foobar.Employee.prototype.makeCoffee = function(isDecaf)
{
this.coffeeMaker.putCoffeeInMachine(isDecaf);
this.coffeeMaker.start();
var event = new foobar.CoffeeEvent(isDecaf);
this.coffeeEvents.dispatchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)
博斯曼先生听了这个.
foobar.Boss.prototype.addEmployee = function(employee)
{
...
goog.events.listen(employee.coffeeEvents, 'COFFEE_ON', function(e)
{
if (e.isDecaf)
{
this.refillMug();
}
}, false, this);
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不会告诉我哪个员工重新装满咖啡,因为事件目标将是一个实例CoffeeEventTarget.如果您想要所有内容Employee,我想您可以将其添加为成员字段.如果你是用继承来确定Employee从goog.events.EventTarget那么你得到Employee了免费的目标.