2013-04-12 16 views
6

Tôi muốn để mô phỏng sự kiện C# 's trong JavaScript: những gì tôi muốn làm là một cái gì đó như thế này:Simulate C# như các sự kiện trong javascript

Hãy nói rằng tôi có đoạn mã sau:

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(); 

gì tôi muốn phải làm là khi tôi gọi my_class_obj.Event, tất cả các chức năng đã đăng ký sẽ được gọi.

Điều này có thể đạt được hoàn toàn bằng JavaScript hoặc tôi cần tìm đường đi xung quanh thông qua các sự kiện DOM không?

Trả lời

4

Làm thế nào về cách viết một lớp sự kiện riêng biệt: link tham khảo: 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); 
     } 
    } 
}; 

Và lớp học của tôi của bạn. Ví dụ:

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); 
    } 
} 

Theo dõi sự kiện mã ví dụ:

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

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

Bạn có thể đính kèm thêm xử lý sự kiện và tất cả các xử lý sự kiện sẽ được gọi. Và bạn cũng có thể thêm các sự kiện khác như bạn muốn: ví dụ sự kiện addressChanged. Cách tiếp cận này cũng mô phỏng sự kiện C# (người gửi và args)

+1

Chính xác đó là những gì tôi đã tìm ra, cảm ơn người đàn ông! Điều này hoạt động tuyệt vời! Tuy nhiên. Tôi đang tự hỏi về Garbage Collection, nếu muốn loại bỏ một handler, làm thế nào tôi có thể chắc chắn rằng đó là rác thu thập được, là các phương pháp vô danh thu thập rác ngay sau khi tham khảo của họ được loại bỏ ?? – hiddenUser

+1

tốt, không nên có sự khác biệt giữa các phương thức ẩn danh và phương thức được khai báo trong trường hợp này. Chúng ta cũng thường sử dụng các phương thức nặc danh trong jQuery: $ (document) .ready (function() {}); –

0

Bạn có thể viết Observer của riêng bạn (nhà xuất bản-thuê bao) đọc GOF. Hoặc, nếu sử dụng jQuery, các sự kiện tùy chỉnh (http://api.jquery.com/trigger/) có thể giúp bạn.

Các vấn đề liên quan