Показать сообщение отдельно
  #6 (permalink)  
Старый 14.03.2015, 17:18
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

/**
 * @class Base
 */
var Base = function Base() {};
Base.prototype = {

    /**
     * @private
     */
    _events: null,

    /**
     * @method trigger
     * @param {String} eventName
     * @param {*|Array} [arg]
     * @returns @this
     */
    trigger: function (eventName, arg) {

        var $Event = function (type) {
            this.type = type;
        };

        if (!this._events || !this._events[eventName]) {
            return this;
        }

        if (!(arg instanceof Array)) {
            arg = [arg];
        }

        var iteration = function () {

            var arrEvents = this._events[eventName].slice();

            arrEvents.forEach(function (handler) {
                handler.apply(new $Event(eventName), arg);
            });

        }.bind(this);

        iteration();


        return this;
    },

    /**
     * @method bind
     * @param {String|Object} eventName
     * @param {function|Array} [handler]
     * @returns @this
     */
    bind: function (eventName, handler) {

        if (eventName == undefined) {
            console.log("Неверные параметры!");
            return this;
        }

        if (typeof eventName == "object") {
            this.iterationObj(eventName, function (handler, eventName) {
                this.bind(eventName, handler);
            }.bind(this));
            return this;
        }

        if (handler == undefined) {
            console.log("Неверные параметры!");
            return this;
        }

        if (!this._events) {
            this._events = {};
        }

        if (!this._events[eventName]) {
            this._events[eventName] = [];
        }

        if (!(handler instanceof Array)) {
            this._events[eventName].push(handler);
        } else {
            this._events[eventName] = this._events[eventName].concat(handler);
        }

        return this;
    },

    /**
     * @method unbind
     * @param {String|Object} [eventName]
     * @param {function} [handler]
     * @returns @this
     */
    unbind: function (eventName, handler) {

        if (eventName == undefined) {
            this._events = {};
            return this;
        } else if (eventName instanceof Object) {
            for (var key in eventName)
                if (eventName.hasOwnProperty(key))
                    this.unbind(key, key[eventName]);

            return this;
        }

        if (handler == undefined) {
            if (this._events && eventName in this._events) {
                this._events[eventName] = [];
                return this;
            }
            return this;
        }

        for (var i = 0; i < this._events[eventName].length; i++) {

            if (this._events[eventName][i] == handler) {
                this._events[eventName].splice(i, 1);
                break;
            }

        }

        return this;
    }

};


var Obj1 = new Base();

Obj1.bind("some event", function () {
  alert("some event!");
});

Obj1.bind("some event", function () {
  alert("some event!2");
});

Obj1.trigger("some event", []);


Раньше я использовал этот объект как базовый класс. Я наследовался от него и все мои объекты могли общаться событиями. Сейчас я использую события взятые из backbone (хотя в целом там тоже самое)

Последний раз редактировалось tsigel, 14.03.2015 в 17:22.
Ответить с цитированием