Ich habe durch viele verschiedene Blog-Beiträge und Themen hier gelesen, um zu sehen, wie oder auch wenn, was ich mit Templates tun möchte getan, aber nichts gefunden haben, was funktioniert.Angular 4 und dynamische Vorlagen
Wir haben ein Symbol Komponente, die ganz einfach in der Struktur ist, die durch einfach unter Verwendung der Komponente und Spezifizierungs eingerichtet ist, das Symbol und Größe in der Vorlage benötigt wird, es zu benutzen:
import {Component, Input} from '@angular/core';
@Component({
selector: 'comp-icon',
template: `
<span class="{{ class }}" *ngIf="icon === 'error'" >
<svg [attr.height]="size" viewBox="0 0 48 48" [attr.width]="size" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
</span>
<span class="{{ class }}" *ngIf="icon === 'success'" >
<svg [attr.height]="size" viewBox="0 0 48 48" [attr.width]="size" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
</span>
`
})
export class IconComponent {
@Input() icon: string;
@Input() size: number;
@Input() class: string;
constructor() {
}
}
Das Problem ist, dass die oben wiederholt sich für viele weitere Zeilen und wir versuchen, die Fähigkeit hinzufügen, benutzerdefinierte SVG-Bilder aus den verschiedenen Anwendungen, die die Bibliothek, die diese Komponente implementiert ist, zu der Liste hinzufügen. Bisher ist dies, was ich habe es geschafft, das ist im Grunde zeigt, was wir erreichen wollen:
import {Component, Input, OnInit, ViewChild} from '@angular/core';
import {Icons} from './icons';
@Component({
selector: 'comp-icon',
template: `
<span class="{{ class }}">
<ng-container [ngTemplateOutlet]="iconContent"></ng-container>
</span>
`
})
export class IconComponent implements OnInit {
@Input() icon: string;
@Input() size: number;
@Input() class: string;
@ViewChild('iconContent') iconContent: any;
constructor() {
}
ngOnInit() {
this.iconContent = (Icons.find(icon => icon.name === this.icon) || { name: '', content: '' }).content;
}
}
und die entsprechenden icons.ts sieht wie folgt aus:
export interface IIcon {
name: string;
content: string;
}
export const Icons: IIcon[] = [
{
name: 'error',
content: `<svg [attr.height]="{SIZE}" [attr.width]="{SIZE}" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
</svg>`
},
{
name: 'success',
content: `<svg [attr.height]="{SIZE}" [attr.width]="{SIZE}" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
</svg>`
},
];
Ist es überhaupt möglich, dynamisch den Inhalt eines Abschnitts einer Komponente auf diese Weise angeben, in diesem Fall die Svg? Ich habe einiges über Richtlinien gelesen, die in der Lage sind, dies zu erreichen, aber nichts steht wirklich heraus oder ich habe nicht wirklich herausgefunden, wie.
Sie möchten Komponenten oder Winkelattribute und andere Bindungen verwenden, dann müssen Sie die Komponente zur Laufzeit kompilieren. Siehe zum Beispiel https://stackoverflow.com/questions/38888008/how-can-i-use-create-dynamic-template-to-compile-dynamic-component-with-angular –
Nun, ich möchte nicht unbedingt _want_ tun das, aber es sieht nicht so aus, als hätte ich eine große Auswahl, da 'innerHTML' svgs nicht mag. Danke für den Link, ich werde es mir ansehen. P.S. Ich bin mir nicht sicher, wofür das Down-Vote bestimmt war, wer auch immer es getan hat. – DavidIQ
Sie können Svg mit innerHTML, aber keine Bindungen verwenden. Sie müssen möglicherweise als sicher markieren https://stackoverflow.com/questions/31548311/angular-2-html-binding/41089093#41089093. Sie können die TypScript-String-Interpolation ** verwenden, bevor Sie sie an innerHTML anstelle von Bindungen übergeben. –