私はテンプレートを使って何をしようとしているのか、あるいは動作しているかどうかを調べるために、ここでさまざまなブログ投稿とトピックを読んできました。角4とダイナミックテンプレート
私たちは、単にアイコンとサイズは、それを使用してテンプレートで必要とされる部品や指定を使用して設定された構造では非常に単純ですアイコンコンポーネントを持っている:
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() {
}
}
問題があることですこれ以上の行が繰り返されており、このコンポーネントを実装しているライブラリを使用するさまざまなアプリケーションからカスタムSVGイメージをリストに追加する機能を追加しようとしています。
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;
}
}
とそれに対応するicons.tsは、次のようになります:
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>`
},
];
はそれがに可能なすべてのです今のところ、これは、私は基本的に我々が達成しようとしているものを示している管理しているものですこのようにしてコンポーネントのセクションの内容を動的に指定します。この場合、svg?私はディレクティブがこれを達成できるかについていくつか読んだことがありますが、実際に何も出ていないか、実際にはどう考えていません。
コンポーネントや角度属性などのバインディングを使用したい場合は、実行時にコンポーネントをコンパイルする必要があります。例えばhttps://stackoverflow.com/questions/38888008/how-can-i-use-create-dynamic-template-to-compile-dynamic-component-with-angularを参照してください –
私は必ずしもそうする必要はありません'innerHTML'はsvgsが好きではないので、私は選択肢の多くを持っているように見えません。リンクをありがとう、私はそれを見てみましょう。 S.誰がそれをしたのかについては、下降票が何であったのかはっきりしない。 – DavidIQ
svgはinnerHTMLでは使用できますが、バインディングは使用できません。安全なhttps://stackoverflow.com/questions/31548311/angular-2-html-binding/41089093#41089093としてマークする必要があります。 TypeScriptの文字列補間は**の前に**バインディングの代わりにinnerHTMLに渡すことができます。 –