Skip to content
Grigoriev Oleg edited this page Mar 13, 2013 · 2 revisions

go.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
Clone this wiki locally