使用谷歌关闭创建活动

Ben*_*ynn 9 javascript google-closure

我想在谷歌闭包(GC)环境中使用事件在我的对象之间进行通信.

假设我有两个类foobar.Bossfoobar.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,我想您可以将其添加为成员字段.如果你是用继承来确定Employeegoog.events.EventTarget那么你得到Employee了免费的目标.