Я создал компонент в своем приложении, который действует как обертка для тега ввода (я делаю свою собственную библиотеку пользовательского интерфейса для забавы). Мой компонент будет использоваться так.
<sio-input [label]="'Sio Input Label'">
<input type="text" name="">
</sio-input>
Смысл в том, чтобы динамически добавлять классы и функциональные возможности CSS, чтобы разработчику не приходилось это делать. Вот мой компонент (я действительно уменьшил код для удобства чтения)
@Component({
selector: 'sio-input',
templateUrl: './input.component.html', // only contains <ng-content></ng-content>
styleUrls: ['./input.component.scss'],
})
export class InputComponent implements OnInit {
@Input() label: string;
// this component used Render2 - https://angular.io/api/core/Renderer2
constructor(private elRef: ElementRef, private renderer: Renderer2) {
}
ngOnInit() {
// if a label exist prepend it to the HTML
if (this.label) {
const formInput = this.elRef.nativeElement.querySelector('input');
const appendLabel = this.renderer.createElement('LABEL');
const textNode = this.renderer.createText(this.label);
this.renderer.addClass(appendLabel, 'sio-input__label');
this.renderer.appendChild(appendLabel, textNode);
this.renderer.insertBefore(this.elRef.nativeElement, appendLabel, formInput);
// add the directive
this.renderer.setAttribute(formInput, 'sioInput', null);
}
}
}
@Directive({
selector: '[sioInput]'
})
export class SioInputDirective {
@HostListener('focus', ['$event.target'])
onFocus(event) {
console.log('Boom! We Have Focus');
}
}
Как видите, я хочу динамически добавить директиву атрибута к formInput
, который я нахожу в DOM компонента. К сожалению, это не работает, так как вывод, представленный renderer.setAttribute
, берет имя атрибута 'sioInput
' и отображает его 'sioinput
', поэтому Angular не распознает директиву атрибута. Должен ли я вручную указывать имя директивы в шаблоне HTML на входе, естественно, все работает, но я хочу, чтобы это было динамическим. Что я делаю неправильно? Как динамически установить директиву атрибута без преобразования имени в нижний регистр.
Заранее большое спасибо - если я плохо объяснил свою проблему или это сбивает с толку, пожалуйста, скажите, и я перефразирую свой вопрос.