Механизм псевдонимов Alias
Glossary Item Box
Общие сведения
Механизм псевдонимов Alias — механизм, обеспечивающий частичную обратную совместимость при изменении пользовательского интерфейса в новых версиях продукта. При разработке новых версий периодически возникает необходимость переместить элементы страницы в новые зоны. В ситуациях, когда пользователи проводили кастомизацию страницы редактирования, подобные изменения могут привести к непредсказуемым последствиям. Механизм псевдонимов Alias позволяет избежать этого, взаимодействуя с построителем diff —классом json-applier, осуществляющим слияние всех параметров базовой схемы и схем замещения пользователей.
Diff — массив объектов, отвечающий за отображение элементов схемы. Может содержать в себе контейнеры, элементы управления, модули и поля. Более подробно о массиве diff можно узнать из статьи "Массив diff".
Описание
Свойство alias содержит в себе информацию о предыдущем названии элемента. Эта информация учитывается при построении массива модификаций diff, сообщая о необходимости учитывать элементы не только с новым именем, но и с именем, указанным в alias. Фактически alias представляет собой конфигурационный объект, который связывает два разных элемента — новый и старый. При построении массива модификаций diff благодаря конфигурационному объекту alias можно исключить применение некоторых свойств и операций по отношению к элементу, в котором он объявлен. Объект alias может быть добавлен в любой элемент массива модификаций diff.
Структура объекта alias
Объект alias содержит в себе три настраиваемых свойства:
- name — имя элемента, с которым связан новый элемент. По этому имени будут находиться элементы в замещенных схемах и связываться с новым элементом.
ВАЖНО
Значение cвойства name элемента массива модификаций diff не должно быть равным свойству alias.name.
- excludeProperties — массив свойств объекта values элемента массива модификаций diff, которые не будут применяться при построении diff.
- excludeOperations — массив операций, которые не должны применяться к данному элементу при построении массива модификаций diff.
Пример использования объекта alias:
// Массив diff. diff: /**SCHEMA_DIFF*/ [ { // Операция, совершаемая с элементом. "operation": "insert", // Новое имя элемента. "name": "NewElementName", // Значения элемента. "values": { // ... }, // Конфигурационный объект alias. "alias": { // Предыдущее имя элемента. "name": "OldElementName", // Массив исключаемых свойств. "excludeProperties": [ "layout", "visible", "bindTo" ], // Массив игнорируемых операций. "excludeOperations": [ "remove", "move", "merge" ] } }, ///... ]
Пример использования механизма Alias при многократном замещении схемы
Есть начальный элемент массива модификаций diff с именем "Name" и некоторым набором свойств. Элемент расположен в контейнере Header. Эта схема замещена несколько раз, при этом элемент с именем "Name" всячески модифицируется и перемещается.
Свойство diff базовой схемы:
diff: /**SCHEMA_DIFF*/ [ { // Операция вставки. "operation": "insert", // Имя элемента-родителя, в который осуществляется вставка. "parentName": "Header", // Имя свойства элемента-родителя, с которым производится операция. "propertyName": "items", // Имя элемента. "name": "Name", // Объект значений свойств элемента. "values": { // Разметка. "layout": { // Номер колонки. "column": 0, // Номер строки. "row": 1, // Количество объединенных колонок. "colSpan": 24 } } } ] /**SCHEMA_DIFF*/
Свойство diff после первого замещения базовой схемы:
diff: /**SCHEMA_DIFF*/ [ { //Операция объединения свойств двух элементов. "operation": "merge", "name": "Name", "values": { "layout": { "column": 0, // Номер строки. Элемент перемещен. "row": 8, "colSpan": 24 } } } ] /**SCHEMA_DIFF*/
Свойство diff после второго замещения базовой схемы:
diff: /**SCHEMA_DIFF*/ [ { //Операция перемещения. "operation": "move", "name": "Name", //Имя элемента-родителя, в который осуществляется перемещение. "parentName": "SomeContainer" } ] /**SCHEMA_DIFF*/
В новой версии элемент с именем "Name" был перемещен из элемента SomeContainer в элемент ProfileContainer и должен там остаться несмотря на кастомизации клиента. Для этого элемент получает новое имя "NewName" и к нему добавляется конфигурационный объект alias.
diff: /**SCHEMA_DIFF*/ [ { // Операция вставки. "operation": "insert", // Имя элемента-родителя, в который осуществляется вставка. "parentName": "ProfileContainer", // Имя свойства элемента-родителя, с которым производится операция. "propertyName": "items", // Новое имя элемента. "name": "NewName", // Объект значений свойств элемента. "values": { // Привязка к значению свойства или функции. "bindTo": "Name", // Разметка. "layout": { // Номер колонки. "column": 0, // Номер строки. "row": 0, // Количество объединенных колонок. "colSpan": 12 } }, // Конфигурационный объект alias. "alias": { // Старое имя элемента. "name": "Name", // Массив игнорируемых свойств пользовательского замещения. "excludeProperties": [ "layout" ], // Массив игнорируемых операций пользовательского замещения. "excludeOperations": [ "remove", "move" ] } } ] /**SCHEMA_DIFF*/
В новом элементе добавился alias, изменился родительский элемент и его расположение на странице редактирования. В свойстве excludeProperties хранится набор свойств, которые будут проигнорированы при применении разницы, а внутри excludeOperations хранится набор операций, которые не будут применяться к этому элементу из замещений.
В данном примере исключены свойства layout всех наследников для элемента с именем "Name", а также запрещены операции remove и move. Это говорит о том, что элемент с именем "NewName" будет содержать только корневое свойство layout и все свойства элемента "Name" из замещений, кроме Layout. Это же касается и операций.
Результат для построителя массива модификаций diff будет следующим:
diff: /**SCHEMA_DIFF*/ [ { // Операция вставки. "operation": "insert", // Имя элемента-родителя, в который осуществится вставка. "parentName": "ProfileContainer", // Имя свойства элемента-родителя, с которым производится операция. "propertyName": "items", // Новое имя элемента. "name": "NewName", // Объект значений свойств элемента. "values": { // Привязка к значению свойства или функции. "bindTo": "Name", // Разметка. "layout": { // Номер колонки. "column": 0, // Номер строки. "row": 0, // Количество объединенных колонок. "colSpan": 12 }, } }, ] /**SCHEMA_DIFF*/