6

我想在 JavaScript 中模拟 C# 的事件:我想做的是这样的:

假设我有以下代码:

function addToInvocationList(method, listener) {
      *Some code to add listener to the invocation list of method*
}

function MyClass() {
}

MyClass.prototype.Event = function() {}

var my_class_obj = new MyClass();

function subscriberFunction1() {}
function subscriberFunction2() {}
function subscriberFunction3() {}

addToInvocationList(my_class_obj.Event, subscriberFunction1);
addToInvocationList(my_class_obj.Event, subscriberFunction2);
addToInvocationList(my_class_obj.Event, subscriberFunction3);

my_class_obj.Event();

我想要做的是当我调用 my_class_obj.Event 时,所有订阅的函数都会被调用。

这可以纯粹在 JavaScript 中实现,还是我需要通过 DOM 事件找到解决方法?

4

2 回答 2

7

写一个单独的事件类怎么样:参考链接:http ://alexatnet.com/articles/model-view-controller-mvc-javascript

function Event(sender) {
    this._sender = sender;
    this._listeners = [];
}

Event.prototype = {
    attach: function (listener) {
        this._listeners.push(listener);
    },
    notify: function (args) {
        for (var i = 0; i < this._listeners.length; i++) {
            this._listeners[i](this._sender, args);
        }
    }
};

还有你我的课。例如:

function MyClass(name) {
     var self = this;
     self.Name = name;
     self.nameChanged = new Event(this);

     self.setName = function (newName){
         self.Name = newName;
         self.nameChanged.notify(newName);
     }
}

订阅事件示例代码:

var my_class_obj = new MyClass("Test");
my_class_obj.nameChanged.attach(function (sender,args){

});
my_class_obj.setName("newName");

您可以附加更多事件处理程序,所有这些事件处理程序都将被调用。您还可以根据需要添加更多事件:例如 addressChanged 事件。这种方法还模拟了 c# 事件(sender 和 args)

于 2013-04-12T06:41:59.577 回答
0

您可以编写自己的观察者(发布者-订阅者)阅读 GOF。或者,如果使用 jQuery,自定义事件 ( http://api.jquery.com/trigger/ ) 可以帮助您。

于 2013-04-12T06:01:10.477 回答