I am defining my own <input> component with label, layout, bootstrap classes, etc. So when I use it like this:
<my-input label="Street" [(ngModel)]="address.street"></my-input>
Then it will instantiate MyInputComponent, which will use a rich template to generate something like:
<div class="form-group">
<label class="col-sm-3 control-label">{{ label }}</label>
<div class="col-sm-9">
<input [(ngModel)]="value" class="form-control">
</div>
</div>`
This is working great and I can access the "label" attribute just by using @Input:
@Component({...})
export class MyInputComponent {
@Input() label = '';
Now that is great for just a few attributes. But the HTML standard <input> tag has literally dozens of attributes such as type, min, max, placeholder... and I don't want to have to define every single possible attribute as an @Input property of MyInputComponent.
Instead, I want to dynamically iterate over the attributes in <my-input> and copy them to the <input> element inside my template. I know I can access the list of attributes of the DOM element by using ElementRef in the constructor and then accessing its nativeElement property:
constructor(eref: ElementRef) {
console.log("***", eref.nativeElement);
}
But accessing nativeElement is discouraged as a bad practice for several reasons (see https://angular.io/docs/js/latest/api/core/index/ElementRef-class.html).
So the question is: is there some way to access the list of attributes of <my-input> without resorting to directly reading the native browser DOM?
And likewise, once I have the list of attributes in a neutral, non-native way, how can I then propagate them to the <input> tag inside my template?