Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Покритикуйте реализацию паттерна наблюдатель на jQuery (https://javascript.ru/forum/project/36172-pokritikujjte-realizaciyu-patterna-nablyudatel-na-jquery.html)

Shitbox2 06.03.2013 08:01

Покритикуйте реализацию паттерна наблюдатель на jQuery
 
//Трансляция глобальных событий подписчикам
$.fn.obs = function (eventList) {     
    return this.each(function () {
        for (event in eventList) {
            if (eventList[event] !== null) {
                $(document).on(event, jQuery.proxy(eventList[event], this))
            } else {
                $(document).off(event, jQuery.proxy(eventList[event], this))
            }
        }
    })      
}

//Вызов события
$(document).trigger('event1', data)

//Подписка на события
$('#object').obs({
    'event1': function (e, data) {
        //function 1
    },
    'event2': function (e, data) {
        //function 2
    }
})

Тут, конечно, проблема с отпиской от событий, пока не знаю как решить

danik.js 06.03.2013 08:42

Я так понимаю это тоже что и
$(document).on('event1', (function(e, data) {
    //function 1
}).bind($('#object')));

$(document).on('event2', (function(e, data) {
    //function 2
}).bind($('#object')));


просто удобнее?

Shitbox2 06.03.2013 12:22

Не очень понял способ... И зачем bind, он же depricated?

Тут смысл в том, чтобы поместить обработчики в тот объект к которому они относятся. Тогда уж так:
$('#object').each(function () {
    $('document').on({
        'event1': function (e, data) {
            //function 1
        },
        'event2': function (e, data) {
            //function 2
        }
    })
})

Правда кода в слушателе стало больше. И как удалить такой обработчик?
$('document').off(event1, event1)

danik.js 06.03.2013 15:52

Цитата:

Сообщение от Shitbox2
И зачем bind, он же depricated?

Да ладно?
Ну тогда так:

$(document).on({
    event1: (function(e, data) {
        //function 1
    }).bind($('#object')),
    event2: (function(e, data) {
        //function 2
    }).bind($('#object'))
});

Shitbox2 06.03.2013 17:06

Цитата:

Сообщение от nasqad
Всегда когда вижу return function, делают что то через жопу)

Через жопу или через замыканиес
Цитата:

Сообщение от danik.js
Ну тогда так:

Спутал бинды, сорри) Конечно код понакрученей... А можно как-нибудь установить обработчик на объект, чтобы он срабатывал от любого события с заданным именем, даже не для этого объекта?


Часовой пояс GMT +3, время: 07:55.