2011-07-29 28 views
17

Tôi đang cố gắng hiểu rõ hơn về các kỹ thuật hướng đối tượng trong tập lệnh Java.cách Tăng sự kiện tùy chỉnh từ bên trong đối tượng tập lệnh java

Tôi có đối tượng folowing (tầm thường).

function CustomObject() { 
    this.size = 1; 
}; 

CustomObject.prototype.addSize = function() { 
    this.size += 1; 
    if(this.size > 5) { 
     //Raise custom Event 
    } 
}; 

Và tôi đang quảng bá nó như thế này.

var myObject = new CustomObject(); 
    myObject.addSize(); 

    // Add listener for custom event from with in my Custom Object. 
    // Something like this.... 
    myObject.addEventListener("CustomEvent", handelCustomEvent, false); 

    function handelCustomEvent() {} 

Làm cách nào để tăng sự kiện tùy chỉnh trong đối tượng tùy chỉnh của tôi và sau đó lắng nghe sự kiện đó trong phụ huynh? Có phải loại điều này thậm chí có thể trong kịch bản Java không?

+0

Cảm ơn vì điều đó. Tôi đã có một cái nhìn tại các công cụ jquery, có vẻ tốt ngoại trừ có vẻ như nó đòi hỏi các yếu tố DOM. –

Trả lời

12

Bạn có thể thực hiện việc này bằng cách tạo lớp sự kiện tùy chỉnh có các chức năng liên quan đến trình nghe và trình kích hoạt. Tôi đã tìm thấy một số good article về việc này. Lớp học được triển khai như sau:

//Copyright (c) 2010 Nicholas C. Zakas. All rights reserved. 
//MIT License 

function EventTarget(){ 
    this._listeners = {}; 
} 

EventTarget.prototype = { 

    constructor: EventTarget, 

    addListener: function(type, listener){ 
     if (typeof this._listeners[type] == "undefined"){ 
      this._listeners[type] = []; 
     } 

     this._listeners[type].push(listener); 
    }, 

    fire: function(event){ 
     if (typeof event == "string"){ 
      event = { type: event }; 
     } 
     if (!event.target){ 
      event.target = this; 
     } 

     if (!event.type){ //falsy 
      throw new Error("Event object missing 'type' property."); 
     } 

     if (this._listeners[event.type] instanceof Array){ 
      var listeners = this._listeners[event.type]; 
      for (var i=0, len=listeners.length; i < len; i++){ 
       listeners[i].call(this, event); 
      } 
     } 
    }, 

    removeListener: function(type, listener){ 
     if (this._listeners[type] instanceof Array){ 
      var listeners = this._listeners[type]; 
      for (var i=0, len=listeners.length; i < len; i++){ 
       if (listeners[i] === listener){ 
        listeners.splice(i, 1); 
        break; 
       } 
      } 
     } 
    } 
}; 

Nhưng, như người viết cho biết lớp này chưa hoàn thành. Nó có một số hạn chế. Vì vậy, tôi khuyên bạn nên sử dụng jQuery để thay thế. Bạn có thể dễ dàng sử dụng sự kiện tùy chỉnh của mình với chức năng bind()trigger(). Có một chủ đề tốt về điều này. Nếu bạn thấy Custom events in jQuery?, bạn sẽ tìm hiểu cách triển khai nó với jQuery.

2

Nhờ @Sangdol cho liên kết đến đối tượng sự kiện tùy chỉnh. Sử dụng các ý tưởng trong đó tôi đã đưa ra giải pháp sau

function CustomObject (type, listener) { 
    this.size = 1; 
    this.subscriberType = type; 
    this.subscriberListener = listener; 
}; 

CustomObject.prototype.addSize = function() { 
    this.size += 1; 
    if (this.size > 5) { 
     this.subscriberListener.call(this.subscriberType); 
    } 
}; 

// Test the event 
var myObject = new CustomObject(Document, handelCustomEvent); 

myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize(); 
myObject.addSize();  

function handelCustomEvent() { alert("Event"); } 

Đó không phải là giải pháp hoàn hảo, nhưng nó đủ cho mục đích của tôi.

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