Пользовательский Javascript EventManager - пожалуйста, помогите мне завершить - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь создать собственный JavaScript-класс EventManager.Я принял формат, который Грант Скиннер использует в своей среде easel.js для создания класса, и мне нужно придерживаться его.На самом деле, я просто немного растерялся - я думаю, что - по крайней мере, в концептуальном смысле - у меня есть правильная идея, и что в основном меня избегают проблемы с областью действия.здесь можно помочь мне довести это до такой степени, что addListener и dispatchEvent работают.

[code]

(function(window) {
    var EventManager = function() {
        this.initialize();
    }
    var p = EventManager.prototype;

    // place properties here



    // Constructor
    p.initialize = function() {
        p.listeners = new Array();
    }

    // public methods


    p.addListener = function(fn, event) {
        console.log("p.addListener Hit");
        console.log("event: " + event);
        console.log("handler function: " + fn);
        if(!this.listeners[event]) {
            this.listeners[event] = [];
        }

        if(fn instanceof Function) {
            this.listeners[event].push(fn);
        }
        return this;
    }

    p.dispatchEvent = function(event, params) {
        console.log("Dispatch Event");
        // loop through listeners array
        for(var index = 0; index < listeners[ev].length; index++) {
            // execute matching 'event' - loop through all indices and
            // when ev is found, execute
            listeners[event][index].apply(window, params);
        }
    }

    p.removeListener = function(event, fn) {
        // split array 1 item after our listener
        // shorten to remove it
        // join the two arrays back together

    }
    window.EventManager = EventManager;

}(window));


[/code]
[code]
    <script>

    eventManager = new EventManager();

    var FooTest = function() {
        this.fire = function() {
           //alert("fire");
        }

            this.fire();
     };

    function onFire() {
       // console.log("FIRED!");
    }

    var o = new FooTest();
   eventManager.addListener.call("fire", onFire );
   // eventManager.dispatchEvent.call(o,'fire' );

    </script>
[/code]

Спасибо за вашу помощь !!!

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Вот рабочий пример исправленного кода: http://jsfiddle.net/JxYca/3/

По большей части ваш код работал, всего несколько небольших проблем тут и там.IFFE является выражением немедленного вызова функции (IIFE).Это то, что вы делали со всей функцией (окно) {} (окно).Однако в этом случае это абсолютно не нужно и просто загрязняет код.В javascript нет такой вещи, как хеш-таблица, однако вы можете просто использовать объект вместо него.Имена свойств становятся ключевыми, и их значение теперь равно значению хеш-таблицы.

Дополнительный и своего рода не связанный, хотя для вас.Это способ делать события в хорошем, но если у вас есть, скажем, 3 обработчика, прикрепленных к событию, и второй не выполняется с исключением JavaScript, третий не будет выполнен.Возможно, вы захотите взглянуть на то, как prototype.js выполняет события здесь: https://github.com/sstephenson/prototype/blob/master/src/prototype/dom/event.js Их события не блокируют.

0 голосов
/ 30 ноября 2018

см. Этот проект,

Джетемит очень просто

https://github.com/uxitten/jetemit

...