Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разделение ответственности, массив callback-функций 
:(
    Опции темы
fish9370
Дата 19.4.2012, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Добрый день,

есть у меня модули, на php, я стараюсь делать так чтобы каждый из них был независим от других, как на стороне сервера так и на стороне клиента, но иногда требуется их взаимодействие. 

Привожу пример: 
1) модуль "Поиск", на стороне клиента ajax-форма, на стороне сервера поиск и выдача. 
2) модуль "Фильтр" работает исключительно на стороне клиента, отображает выдачу постранично, сортирует результаты, может фильтрануть еще по каким-то признакам и т.д.

задача: 
при поступлении новых данных, модуль "Поиск" должен маякнуть модулю "Фильтр" об изменениях, своеобразный onChange для фильтруемого объекта.. как было уже отмечено, они не должны ничего знать друг о друге..

решение:
1) после загрузки страницы, в модуле фильтр производится проверка на существования глобального массива коллбэк-функций, если его нет он его создает.
2) регистрирует себя в этом массиве
3) коллбэк-функция при вызове делает проверку обслуживаемого объекта, если объект в ее зоне ответственности, производит обработку, иначе выход

4) в ajax-функции, при получении новых данных, после дабавления их в указанную ветвь DOMа, производится вызов всех зарегистрированных коллбэк функций, с передачей ссылки на объект

реализация:
Код

/* check for dirtybomb global object */
if ($.dirtybomb == undefined) {
      $.dirtybomb = {
       };
}

/* check for filters global callback array */
if ($.dirtybomb.filters == undefined) {
     $.dirtybomb.filters = [
     ];
}


Код

/* register filter handler */
$.dirtybomb.filters.push(function(info) {
      if (info.closest('.filter2_section').find('.filter2-{ID}').attr('class') != undefined) {
   

            var page_size = {PAGESIZE};

            var children = info.children('div');
            var count = children.length;

            base = 0;

            i = 0;
            children.each(function()  {
                        if (i < base || i >= base + page_size)
                                        $(this).css('display', 'none');
                        else
                                        $(this).css('display', 'block');

                        i++;
            });

            var container = $('.filter2-{ID} .buttons');
            container.html('');
            for (i = 0; i < (count / page_size); i++) {
                        if (i == 0)
                                         container.append("<li><a href='#' class='button selected' rel='" + (i + 1) + 
                                                "'><span>" + (i + 1) + "</span></a></li>");
                        else
                                         container.append("<li><a href='#' class='button' rel='" + (i + 1) + 
                                                "'><span>" + (i + 1) + "</span></a></li>");
            }
      }
});


* * *

Код

/* call for callback */
if ($.dirtybomb && $.dirtybomb.filters)  {
                 $.each($.dirtybomb.filters, function() {
                                   this(info);
                  });
}


больше всего интересует как это все можно улучшить, возможно существует готовый jquery-плагин управления коллбэк-функциями, любая помощь приветствуется..

Это сообщение отредактировал(а) fish9370 - 19.4.2012, 10:44


--------------------
undefined
PM MAIL WWW ICQ   Вверх
ksnk
Дата 19.4.2012, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(fish9370 @  19.4.2012,  10:42 Найти цитируемый пост)
возможно существует готовый jquery-плагин управления коллбэк-функциями, любая помощь приветствуется

Вообще-то то, что описано хорошо укладывается в событийный метод обработки. 
Цитата(fish9370 @  19.4.2012,  10:42 Найти цитируемый пост)
при поступлении новых данных, модуль "Поиск" должен маякнуть модулю "Фильтр" об изменениях,

При поступлении новых данных модуль Фильтр генерирует событие - DataChanged ( к примеру )
Код

$(document).trigger('DataChanged');

Все заинтересованные в этом событии сущности (модуль Поиск) обязаны поставить свой обработчик этого события
Код

$(document).bind('DataChanged', function(event) {
...
});

то есть из 4 пунктов 2 уже сделаны ;)

Название события в CamelCase стиле - чтобы не пересечься случайно с чьими-нибудь событиями.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
fish9370
Дата 19.4.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Цитата(ksnk @  19.4.2012,  11:03 Найти цитируемый пост)
то есть из 4 пунктов 2 уже сделаны ;)


вот видете, как иногда полезно спросить..

ksnk, большое тебе спасибо..  smile 

ставлю плюс, но тему не закрываю, надо сначала попробовать..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.