私はテーブルを作成するための簡単な部品作り:上記のコンポーネント角度、どのように解析文字列からテンプレートと現在のコンテキスト変数に
@Component({
selector: 'product-admin',
template: `
<h1>Products</h1>
<admin-table [columns]="columns" [records]="products"></admin-table>
`,
providers: [ProductService],
})
export class ProductAdminComponent implements OnInit {
products: Product[];
columns: AdminTableColumn[] = [
{
field: 'id',
label: 'SKU',
},
{
field: 'name',
label: 'Name',
template: '<strong>{{record.name}}</strong>',
}
];
}
を使用した製品のテーブルを作成するために
@Component({
selector: 'admin-table',
template: `
<table class='table table-bordered'>
<thead>
<th *ngFor='let column of columns'>
{{ column.label }}
</th>
</thead>
<tbody>
<tr *ngFor="let record of records">
<td *ngFor='let column of columns' [innerHTML]="fieldContent(column, record) | safeHtml">
</td>
</tr>
</tbody>
</table>
`,
})
export class AdminTableComponent {
@Input() columns: AdminTableColumn[];
@Input() records: {}[];
fieldContent(column: AdminTableColumn, record: {}) {
if (column.template) {
//TODO: parse the template and pass current record as argument
return column.template;
}
return record[column.field];
}
}
およびその他のコンポーネントを
AdminTableColumn
にはtemplate
という追加のオプションがあり、テンプレートを使用してセルの値を設定することができます。しかし、実際の製品名の代わりに{{record.name}}
という値を表示しようとすると、これを行うことはできません。
template
オプションに入力された値を解析して、豊富な表を作成するために、{{record.name}}
または<some-component [title]="record.name"></some-component
>のような角の宣言を使用できるようにする必要があります。言い換えれば
は、私は角度があなたの文字列補間が動作しませんので、innerHTMLプロパティを介して注入HTMLをサニタイズかなり確信しているrender(template, { record: record })
あなたはバインディング '[innerHTMLプロパティ]'プロパティを使用することができます。価値があるショットhttp://stackoverflow.com/questions/34936027/angular-2-how-do-you-render-html-from-a-json-response-without-displaying-the-ta –
currenly私は使用しています'[innerHTML] '、' [innerHTML] = "fieldContent(column、record)| safeHtml"という行を参照してください。コンテンツは(raw)としてレンダリングされますが、 'record'のような変数を渡す必要があります。 – rafrsr
おそらく、 'ChangeDetectorRef'を注入してから' detectChanges() 'を呼び出してみてください。あるいは、他のアプローチは 'NgZone'を注入してから' run() 'を実行しているようです。 –