Dojo或Javascript中的观察者

时间:2011-03-22 21:26:58

标签: javascript dojo

如何在Dojo或Javascript中实现观察者模式?

3 个答案:

答案 0 :(得分:7)

虽然我不确定它是否是Observer Pattern的直接实现,但Dojo Toolkit已经内置了事件系统。

Dojo Connect: dojo.connect既可以用于将DOM事件连接到它们的处理程序,也可以用于将任何函数连接到任何其他函数。

dojo.connect(obj, event, context, method);

发布/订阅: Dojo的发布/订阅可用于定义应用程序范围的主题,然后将处理程序附加/分离给它们。

dojo.subscribe(topic, method);
dojo.publish(topic, parameters);

链接:

这两种技术都会返回一个可用于断开处理程序的令牌。

答案 1 :(得分:3)

在Dojo中很容易。

  1. dojo.connect将允许您在任何对象的任何函数上添加回调。
  2. dijit,Dojo的UI系统,有watch方法为任何属性更改添加回调。
  3. 现在,在纯JavaScript中,它更复杂,因为您无法在任意对象上触发任何属性更新的回调。你只能“劫持”一个属性函数,使它指向一个新函数,并且该函数在调用原始函数后进行回调。但是,你基本上重新实现了dojo.connect,所以请关注Dojo。

    因此,观察者模式只能用于JavaScript中的函数调用。

答案 2 :(得分:2)

我在幻灯片31上的这些幻灯片http://www.slideshare.net/rmsguhan/javascript-design-patterns中找到了javascript的观察者模式。

我在这里输入了

// The Observer Object - One who super sees all the print operations
function printManager(){
    var queue = [];

    //The attach method
    this.addJob = function(name, job){
        queue.push({"name":name,"job":job});
    }

    //the detach method
    this.removeJOb = function(job){
        var _queue = [];
        for(var i in queue){
            if(queue[i].job == job)
                continue;
            else
                _queue.push(queue[i]);
        }
        queue = _queue;
    } ...

我对此进行了修改(特定于我使用)并且工作正常。这对我来说是一个很好的起点。