Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.03.2013, 08:01
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Покритикуйте реализацию паттерна наблюдатель на 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
    }
})

Тут, конечно, проблема с отпиской от событий, пока не знаю как решить
Ответить с цитированием
  #2 (permalink)  
Старый 06.03.2013, 08:42
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

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


просто удобнее?
Ответить с цитированием
  #3 (permalink)  
Старый 06.03.2013, 12:22
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

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

Правда кода в слушателе стало больше. И как удалить такой обработчик?
$('document').off(event1, event1)
Ответить с цитированием
  #4 (permalink)  
Старый 06.03.2013, 15:52
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Shitbox2
И зачем bind, он же depricated?
Да ладно?
Ну тогда так:

$(document).on({
    event1: (function(e, data) {
        //function 1
    }).bind($('#object')),
    event2: (function(e, data) {
        //function 2
    }).bind($('#object'))
});
Ответить с цитированием
  #5 (permalink)  
Старый 06.03.2013, 17:06
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Сообщение от nasqad
Всегда когда вижу return function, делают что то через жопу)
Через жопу или через замыканиес
Сообщение от danik.js
Ну тогда так:
Спутал бинды, сорри) Конечно код понакрученей... А можно как-нибудь установить обработчик на объект, чтобы он срабатывал от любого события с заданным именем, даже не для этого объекта?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хочу инвайт на хабр macdack Оффтопик 45 28.07.2013 23:18
Вопрос поддержки старых методов jQuery antonM jQuery 1 04.10.2012 00:08