Скриптинг в формах
------------------

Основные требования и некоторые детали задачи описаны в
соответствующей постановке: `«Скриптинг в формах» <http://tdd.lan.arta.kz/docs/additional/statements/3/html/forms63.html>`_

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

Примеры использования скриптинга см. `здесь <http://tdd.lan.arta.kz/docs/synergy/tags/wilkes/sdk-doc/html/extfp-usecases/extfp-usecases.html>`_

**Используемые технологии и библиотеки:**

*   `jQuery`
*   `Underscore` - утилиты
*   `Backbone` - UI компоненты
*   `Marionette` - UI компоненты
*   `jQuery ui` - UI компоненты
*   `math.js` - поддержка математики больших чисел
*   `base64.js` - добавляет методы btoa, atob для браузеров,
    в которых их нет (в частности IE 9, 10)
*   `XregExp.js` - поддержка более сложных регулярных
    выражений

Схемы работы проигрывателя
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. figure:: _static/img/schema_1.png

    Общая схема работы проигрывателя

.. figure:: _static/img/schema_2.png

    Процесс изменения модели

.. figure:: _static/img/schema_3.png

    Процесс изменения значения компонента

.. figure:: _static/img/schema_4.png

    Взаимодействие со средой

Общедоступные объекты
~~~~~~~~~~~~~~~~~~~~~

*   ``AS`` - общее пространство имен
*   ``AS.FORMS`` - формы
*   ``AS.COMPONENTS`` - компоненты, которые могут быть использованы отдельно от проигрывателя форм
*   ``AS.SERVICES`` - сервисы
*   ``AS.LOGGER`` - логгер
*   ``AS.OPTIONS`` - настройки
*   ``AS.DICTIONARIES`` - кэш справочников

Типы событий
~~~~~~~~~~~~

*   ``formShow : 'formShow'`` - отображение формы
    (построение новой формы)

*   ``formDestroy : 'formDestroy'`` - метод `destroy`_ модели проигрывателя

*   ``dataLoad: 'dataLoad'`` - подгрузка данных

*   ``valueChange: 'valueChange'`` - изменение значения
    модели

*   ``markInvalid : 'markInvalid'`` - необходимость отображению подсветить невалидное значение

*   ``tableRowAdd: 'tableRowAdd'`` - добавление ряда в таблице

*   ``tableRowDelete: 'tableRowDelete'`` - удаление ряда в таблице

*   ``dictionaryLoad : 'dictionaryLoad'`` - подгрузка справочника

*   ``tagEdit : 'tagEdit'`` - редактирование тега

*   ``tagDelete : 'tagDelete'`` - удаление тега

*   ``loadComponentAdditionalInfo : 'loadComponentAdditionalInfo'`` -
    подгрузка дополнительной информации компонента (сейчас
    используется для пользовательского компонента)

Особенности реализации
~~~~~~~~~~~~~~~~~~~~~~

В области видимости скрипта (добавленный как к компоненту,
так и пользовательскому компоненту) имеются следующие
переменные:

*   ``model`` - модель текущего компонента;
*   ``view`` - отображение текущего компонента;
*   ``editable`` - режим (просмотр / редактирование);
*   ``model.playerModel`` - модель проигрывателя;
*   ``view.playerView`` - отображение проигрывателя.

Скрипт (добавленный как к компоненту, так и пользовательскому
компоненту) выполняется каждый раз при смене режима
проигрывателя (просмотр - редактирование). При этом *модель*
компонента остается та же, а *отображение* компонента каждый
раз пересоздается. Поэтому при написании скриптов следует
учесть следующее: если добавляются или переписываются методы
модели, либо происходит подписывание на события другой модели,
то рекомендуется использовать следующее:

.. code-block:: js
  :linenos:

  if (!model.inited) {
      //манипулирование моделями
      model.inited = true;
  }

**"Строгий режим" JavaScript:**

Начиная с версии Synergy 3.14, все пользовательские скрипты
выполняются с добавлением директивы `use strict`. Эта директива
означает, что соответствующий ей код будет выполнятся в так
называемом **"строгом режиме"**, поддерживающем стандарт `JavaScript`
`ECMAScript5 <http://www.ecma-international.org/publications/standards/Ecma-262.htm>`_

.. warning:: Если код скрипта содержит конструкции, не соответствующие стандарту ES5, то они не будут выполняться. Это не является ошибкой Synergy.

Документация API
~~~~~~~~~~~~~~~~

.. toctree::
  :maxdepth: 2
  :numbered:

  forms/player
  forms/cmp/base
  forms/cmp/table
