Как вызвать пользовательское событие из объекта сценария Java - PullRequest
17 голосов
/ 29 июля 2011

Я пытаюсь лучше понять объектно-ориентированные методы в скрипте Java.

У меня есть следующий (Тривиальный) объект.

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

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

И я это так описываю.

   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() {}

Как вызвать пользовательское событие в моем пользовательском объекте, а затем прослушать это событие в родительском объекте?Это возможно даже в сценарии Java?

Ответы [ 2 ]

13 голосов
/ 29 июля 2011

Вы можете сделать это, создав собственный класс событий, который имеет функции прослушивания и триггера. Я нашел хорошую статью об этом. Класс реализован так:

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

Но, как сказал писатель, этот класс не завершен. У него есть некоторые ограничения. Поэтому я рекомендую вместо этого использовать jQuery. Вы можете легко использовать свое пользовательское событие с функциями bind() и trigger(). Есть хорошая нить об этом. Если вы увидите Пользовательские события в jQuery? , вы узнаете, как реализовать это с помощью jQuery.

2 голосов
/ 29 июля 2011

Спасибо @Sangdol за ссылку на пользовательский объект события. Используя идеи, которые я нашел, я нашел следующее решение

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

Это не идеальное решение, но этого достаточно для моих целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...