jskonst

A blogging framework for hackers.

Callback

При разработке приложений часто возникает задача вызова нового окна, произведение определенных манипуляций и возврат полученного значения в окно, создавшее данный интерфейс. Рассмотрим реализацию данной задачи на примере создания диалогового окна, позволяющего выбрать временной интервал. Для начала добавим кнопку, по нажатии которой будет вызываться окно выбора интервала, как указано на рис.1.

adding button for time dialog

Рис.1 Добавлена кнопка выбора интервала

Функции и графический интерфейс для работы с датами и выбора интервала предоставляются в виде дополнительного набора модулей и могут быть скачаны по ссылке (будет доступна позднее). Внешний вид интерфейса модуля для выбора интервала дат и набор файлов (слева) представлен на рис.2.

interface for interval selection

Рис.2 Графический интерфейс выбора интервала

Прежде чем переходить к добавлению нового окна, следует добавить параметры в запрос, возвращающий визиты питомцев. Для добавления параметра. следует открыть запрос и к списку добавить новые параметры fromDateParam и toDateParam. Настройка свойств нового параметра представлена на рис.3.

add parametr

Рис.3 Добавление параметра в запрос

Новые параметры следует связать с полями таблицы. как показано на рис.4.

change query

Рис.4 Измененный вид запроса

Получившийся текст запроса следует немного видоизменить, таким образом, как показано в блоке кода ниже. Добавление операторов сравнения > и < позволяют выбирать данные между датами, переданными в параметрах. В запросе также добавлена проверка параметров на NULL, чтобы в отсутствии их значений возвращать весь диапазон данных.

Измененный вид запроса
1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 
 * @author jskonst
 * @name VisitsQuery
 * 
 */
Select t1.VISIT_ID, t1.PETID, t1.FROMDATE
, t1.TODATE, t1.DESCRIPTION
From VISIT t1
 Inner Join PetsQuery q on t1.PETID = q.PET_ID
 Where (:fromDateParam is NULL or :fromDateParam < t1.FROMDATE)
 and (:toDateParam is NULL or :toDateParam > t1.TODATE)

К получившемуся запросу добавляем параметры в модели данных (рис.5).

change model

Рис.5 Измененный вид модели с параметрами времени

Теперь можно добавить обработчик кнопки и callback-функцию, которая будет выполнена по закрытии окна выбора временного интервала. Функция обработчика представлена ниже. В качестве параметра функции отображения модального окна showModal() передается callback-функция refreshInterval.

Содержимое функции обработчика нажатия кнопки выбора интервала
1
2
3
4
5
6
7
function buttonActionPerformed(evt) {
  //создаем экземпляр
    // PeriodSelector взято из аннотации @name
        var timeSelect = new PeriodSelector();
        //отображаем модальное окно и передаем callback-функцию в виде параметра
        timeSelect.showModal(refreshInterval);
}

Прежде чем переходить к refreshInterval следует рассмотреть то, что возвращает диалог выбора интервала времени. Как видно из кода. приведенного ниже, функция возвращает JSON с двумя полями begdate и enddate.

Тело функции, возвращающей значения по окончании выбора периода
1
2
3
4
5
6
7
8
9
10
11
/**
 * Возвращает выбранный период в виде объекта со свойствами
 * @return {Object} Объект со свойствами <code>begdate</code> - начало выбранного периода
 *  и <code>enddate</code> - конец выбранного периода
 */
function getPeriod() {
    return {
        begdate: self.parBegDate,
        enddate: self.parEndDate
    };
}

Рассмотрим содержимое callback-функции refreshInterval. Параметр returnedVals в результате вызова получит значение возвращаемого JSON объекта. Соответствующие поля начала и конца периода передаем в параметры модели.

Содержимое callback-функции
1
2
3
4
5
6
7
function refreshInterval(returnedVals){
    //returnedVals - параметры. возвращаемые модальным окном
    self.fromDate = returnedVals.begdate;
    self.toDate = returnedVals.enddate;
    //перевыполняем запрос
    self.pQuery.requery();
}

Результат работы можно посмотреть на рис.6-8.

before time selection

Рис.6 Работа без выбранного интервала времени

time selection

Рис.7 Интерфейс выбора интервала времени

after time selection

Рис.8 Результат фильтрации данных по временному интервалу

P.S. Если руководство непонятно, то можно оставить соответствующий комментарий.

Comments