Я работал над динамической средой Forms, которая разработана для расширения.Элементы (такие как TextElement - который расширяет ValueElement) составляют форму.Они преобразуются в угловые элементы управления (например, FormControl) с помощью «Конструкторов» и организуются в макете формы с помощью «Оркестраторов».Файлы для вышеупомянутых трех элементов хранятся в угловой библиотеке "форм" (ng g lib).
Визуальные представления / компоненты вышеупомянутого создаются "Renderers", и средства визуализации / связанные компонентыхранится в отдельной библиотеке (в зависимости от стиля - например, bootstrap-form-renderers).
ElementHandlers (конструкторы / оркестраторы / средства визуализации) задают свой обработанный элемент с помощью декоратора Typescript.
import {FormElement} from '../../elements/model/form-element';
import {Type} from '@angular/core';
import 'reflect-metadata';
export function ElementHandler<TFormElement extends FormElement>(elementType: Type<TFormElement>): ClassDecorator {
console.log('Handling for ' + elementType);
return target => {
Reflect.defineMetadata('elementType', elementType.name, target.prototype);
};
}
Например:
@ElementHandler(TextElement)
export class TextElementOrchestrator extends FormElementOrchestrator<TextElement> {
}
Обе эти библиотеки импортированы в проект приложения Angular.
При использовании "ng build" (no --prod) код работает хорошо.Каждый элемент формы создается соответствующим образом - например, элемент ввода текста представлен полем ввода, элемент тегов представлен компонентом микросхемы дизайна материала.
Код консоли выглядит так:
TextElement extends forms_core__WEBPACK_IMPORTED_MODULE_1__["ValueElement"] {
/**
* @param {?} id
* @param {?} title
* @param {?} value
*/
constructor(id, title, value) {
super(id, title);
this.value = value;
}
/**
* @return {?}
*/
friendlyValue() {
return this.value;
}
}
Однако, когда используется «--prod», все выглядит как «TextElement», и отображается только поле ввода.
Консоль выглядит следующим образом:
class extends ValueElement{constructor(id,title,value){super(id,title),this.value=[],this.value=value}friendlyValue(){const selectedPredicate=option=>option.selected;return this.options.singleMode?this.value.find(selectedPredicate).value:this.value.filter(selectedPredicate).map(option=>option.value)}}
У меня есть подозрения, что: 1. Декораторы удаляются в процессе сборки приложения библиотеки / Angular, так как при попытке записать метаданные «elementType» в сборке --prod он отображается как «неопределенный» 2.Классы почему-то не включаются в сборку, поэтому вышеупомянутое чтение консоли не показывает подробности о классе.
Есть ли способ, которым я могу разобраться в этом / изменить это, сохраняя при этом оптимизацию сборки в-ситу?
Любые другие вещи, на которые я могу посмотреть?
Буду признателен за любой совет!