Перейти к содержанию

BaseForm (8.3)#

Базовый класс формы.

Создание формы#

Для создания формы в Lexema 8.3 необходимо отнаследовать новый класс от класса BaseForm (или его наследника) и создать в нём статическое свойство template, которое должно возвращать ссылку на шаблон формы. Данное свойство является обязательным.

В большинстве случаев в качестве предков следует использовать один из таких стандартных классов, как Form, Document или Registry.

Привязка данных#

Для того, чтобы при создании формы происходила загрузка данных, необходимо описать в классе статическое свойство binding, которое должно возвращать ссылку на описание модели / запроса (экспериментальный функционал) или на класс особого адаптера данных.

Данные формы должны быть сериализуемы. Наличие в данных объектов с циклическими ссылками недопустимо.

Кэши данных#

Для того, чтобы параллельно с загрузкой основных данных формы происходила загрузка дополнительных коллекций (что применяется, например, для использования т.н. "примитивных лукапов"), следует описать в классе формы статическое свойство dataCaches, которое должно возвращать массив ссылок на описание модели / запроса.

beforeOpen#

Статический метод beforeOpen позволяет написать прикладной код, который будет выполнен перед открытием формы в новой вкладке (не работает для NestedForm).

Метод принимает объект со свойствами:

  • services - Сервисы
  • actionFlags - Объект, который содержит флаги, определяющие контекст действия, совершаемого с формой.
    • isNew - Флаг, обозначающий, что форма используется для создания нового документа
  • key - Ключ открываемого маршрута (объект, содержащий имя маршрута и параметры открываемой формы - код, имя)

Метод должен возвращать Deferred. Если Deferred переходит в состояние resolve, то форма будет открыта, если reject, то форма не откроется и пользователю отобразится окно с сообщением (сообщение берется из класса ошибки, которая была передана в метод reject).

Пример
1
2
3
static beforeOpen ({ services, actionFlags, key }) {
    return $.Deferred().reject(new Error('Сообщение пользователю'))
}

Методы#

closing#

Метод для добавления функционала перед закрытием или обновлением формы.

Пример когда метод возвращает true/false
1
2
3
4
5
6
7
      closing () {
          if (this.data.Name() === 'excel file') {
              console.log('Форма не закроется, пока Name равен excel file')
              return true
          }
          return false
      }
Пример когда метод возвращает promise
1
2
3
4
5
6
7
      closing () {
          return new Promise((resolve, reject) => {
              if (this.actionFlags.isModified) {
                  this.services.dialog.confirm('Вы хотите выйти без сохранения?', 'Да', 'Нет').done(() => { resolve(false) }).fail(() => { resolve(true) })
              } else resolve(false)
          })
      }

События#

resized#

Вызывается при изменении размера формы.

Входные параметры обработчика:

параметр тип описание
width number ширина окна браузера
height number высота окна браузера
Пример
1
2
3
    form1.resized.add(function(width, height) {
        console.log(width, height);
    });

destroyed#

Вызывается после уничтожения формы

Пример
1
2
3
    form1.destroyed.add(function() {
        console.log('test');
    });

titleChanged(text)#

Событие смены заголовка формы.

Входные параметры обработчика:

параметр тип описание
text string текст заголовка
Пример
1
2
3
    form1.titleChanged.add(function(text) {
        console.log(text);
    });

beforeClosed#

Возникает перед закрытием формы.

Пример
1
2
3
    form1.beforeClosed.add(function() {
        console.log('test');
    });

tabActivated#

Событие срабатывает, когда вкладка (в которой находится форма) становится активной.

параметр тип описание
args object объект со свойствами
args.customData object кастомные параметры формы
Пример
1
2
3
    form1.tabActivated.add(function(args) {
        console.log(args);
    });

Примечания

  • Если создается новая форма, то событие в этом случае тоже сработает.
  • Событие не будет срабатывать для вложенных форм.
  • Если в текущей форме перейти на эту же форму, то событие tabActivated не сработает, но customData при этом может измениться. В истории браузера переход по ссылке сохранится.
  • При срабатывании события в аргументах всегда будет приходить тот же объет customData, который был передан изначально (ссылки у объектов будут равны), пока в форму не будет явно передан новый объект (при переходе по ссылке объект всегда будет новым). Передать в форму новый объект customData можно с помощью сервиса NavigationService_(8.3) или при переходе по ссылке (см. метод createViewUrl контрола Link).

Если необходимо в событии отслеживать изменение объекта customData, то это необходимо делать вручную.

Пример
    import { Form } from 'ecosoft-lexema8'
    import template from './testForm.xml'
    export default class TestForm extends Form {
        constructor (args) {
            super(args)
            this.tabActivated.add(({ customData }) => {
                // в объекте customData ожидаем параметр id
                const newId = customData && customData.id
                const oldId = this._customData && this._customData.id
                if (newId !== oldId) {
                    // тут можно написать код, который должен
                    // выполниться при изменении customData
                    console.log('customData changed')
                }
                // сохраняем объект customData
                this._customData = customData
            })
        }
      static get template () {
          return template
      }
    }

Этот пример написан лишь в качестве демонстрации того, как можно сделать проверку изменения объекта customData. В вашем случае проверка может выглядеть иначе.

См. также: DataCache.

Примеры#

См. примеры в статье Form.