-
Notifications
You must be signed in to change notification settings - Fork 1
Ext Options
Расширение go.Ext.Options
предназначено для конфигурирования поведения объектов.
Объекты классов, унаследованных от go.Ext.Options
имеют некий набор настроек.
Причём они могут иметь общий набор настроек по умолчанию и для каждого объекта можно переопределить только нужные настройки.
Есть форма. В ней два поля - email и дата, когда вы хотите на свой email получить письмо.
Нужно на поле с датой повесить всплывающий календарь (возьмём из jquery-ui), который следует локализовать. Также требуется, чтобы форма не отправлялась, если не введён email. В этом случае должно выскакивать предупреждение.
Опишем эту форму классом с использованием go.Ext.Options
:
/**
* @class SomeForm
* @uses jQuery
*/
var SomeForm = go.Class(go.Ext.Options, {
/**
* Дефолтные настройки
*/
'options': {
/* Селектор элемента формы */
'node': "#form",
/* Сообщение при попытке сабмита незаполненной формы */
'warning': "Вы не заполнили все обязательные поля",
/* Селектор текстового поля */
'email': ".email",
/* Селектор поля с вводом даты */
'datefield': ".date",
/* Параметры для datepicker из jquery-ui */
'datepicker': {
'dateFormat' : "yy-mm-dd",
'dayNamesMin' : ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
'firstDay' : 1,
'monthNames' : ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
'inline' : true
}
},
'__construct': function (options) {
this.initOptions(options);
/* Загрузка элемента формы и перехват её отправки */
this.node = $(this.options.node);
this.node.bind("submit", this.onSubmit);
/* Навешивание календаря на поле с датой */
this.node.find(this.options.datefield).datepicker(this.options.datepicker); // навешиваем календарь
},
'onSubmit': function (e) {
if (!this.checkForm()) {
alert(this.options.warning);
return false;
}
},
'onCheckForm': function () {
var nodeEmail = this.node.find(this.options.email);
if (!nodeEmail.val()) {
return false;
}
return true;
}
});
При определении класса, настройки по умолчанию описываются в поле options
.
Мы можем в своём объекте использовать настройки по умолчанию:
var form = new SomeForm();
Либо переопределить некоторые. Например, хотим сменить ID у формы и дату в календаре выводить в другом формате:
var options, form2;
options = {
'node': "#other-id",
'datepicker': {
dateFormat: "dd.mm.YY"
}
};
form2 = new SomeForm(options);
Либо заменить сообщение об ошибке:
var form3 = new SomeForm({'warning': "Ошибка! Ошибка!"});
Переданные в конструктор настройки рекурсивно сливаются с настройками по умолчанию.
Если у нас переопределён конструктор, то следует вызвать конструктор go.Ext.Options
или, что проще, метод initOptions()
:
'__construct': function (options) {
this.initOptions(options); // проверять, не пустой ли аргумент, не надо
// ...
}
Доступ к настройкам можно осуществлять напрямую через this.options
или через метод getOption()
.
Метод позволяет указывать путь к свойству: this.getOption("datepicker.dateFormat")
.
getOptions()
- получить полный список настроек.
Изменение настроек, если требуется, следует производить через метод setOption(path, value)
.
Напрямую изменять options
не рекомендуется по следующей причине.
Когда объект переопределяет некоторые настройки, то они сливаются с дефолтным options
из прототипа и результат сохраняется в this.options
.
Если же объект ничего не переопределяет, то options
в самом объекте не создаётся.
Если в этом случае начать менять его, то будет затронут общий options
из прототипа.
Настройки наследуются и расширяются при наследовании и расширении классов.
/**
* "Базовая" форма. Она знает только об элементе формы и сообщении об ошибке
*/
var BaseForm = go.Class(go.Ext.Options, {
'__abstract': true,
'options': {
'node': "#form",
'warning': "Вы не заполнили все обязательные поля"
}
});
/**
* Конкретная форма. У неё уже есть поля с мылом, датой и настройки календаря.
*/
var SomeForm = go.Class(go.Ext.Options, {
'options': {
'email': ".email",
'datefield': ".date",
'datepicker': {
'dateFormat' : "yy-mm-dd",
'dayNamesMin' : ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
'firstDay' : 1,
'monthNames' : ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
'inline' : true
}
}
// ...
});
При наследовании переопределённые options
рекурсивно сливаются с предковыми.
В go.Ext.Options
определены следующие поля, которые не стоит использовать для других нужд у потомков:
options
initOptions
getOption
getOptions
setOption
__OptionsLazy