2016-10-11 16 views
6

我需要將一個表達式傳遞給將在組件模板內部進行評估的組件。如何將表達式作爲Angular2中的輸入傳遞給組件?

例如,組件:

@Component({ 
    selector: 'app-my-component', 
    ... 
}) 
export class MyComponent { 
    @Input items: MyClass; 
    @Input expression: String; 
    ... 
} 

與組件模板:

<div *ngFor="let item of items"> 
    {{expression}} 
</div> 

爲MyComponent的用法:

<app-my-component [items]="listOfItems" [expression]="'[item.id] item.name'"> 
</app-my-component> 

一樣會有不止一個輸入,我想以避免使用TemplateRef。

+1

什麼是''[item.id] item.name''該怎麼辦?這對我來說不是一個表達。你不能傳遞綁定。 –

+0

將它作爲'[expression] =「'{」id「:[item.id],」name「:item.name}'」'傳遞給並用作expression.id和expression.name –

+0

@GünterZöchbauer這應該評估爲字符串,爲item = {「id」:1,「name」:「Item1」} to [1] Item1 –

回答

16

也許這個選項可以在一個可以幫助你:

1)使用NgFor指令ngForTemplate輸入特性:

組件

@Component({ 
    selector: 'app-my-component', 
    template: ` 
    <div *ngFor="let item of items template: itemTemplate"></div>` 
}) 
export class MyComponent { 
    @Input() items: any; 
    @ContentChild(TemplateRef) itemTemplate: TemplateRef<any>; 
} 

家長

<app-my-component [items]="listOfItems"> 
    <ng-template let-item>[{{item.id}}] {{item.name}}</ng-template> 
</app-my-component> 

Plunker

2)使用NgTemplateOutlet指令

組件

@Component({ 
    selector: 'app-my-component', 
    template: ` 
    <div *ngFor="let item of items"> 
    <ng-template [ngTemplateOutlet]="itemTemplate" [ngTemplateOutletContext]="{ $implicit: item }"></ng-template> 
    </div>` 
}) 
export class MyComponent { 
    @Input() items: any; 
    @ContentChild(TemplateRef) itemTemplate: TemplateRef<any>; 
} 

家長仍然是相同的:

<app-my-component [items]="listOfItems"> 
    <ng-template let-item>[{{item.id}}] {{item.name}}</ng-template> 
</app-my-component> 

Plunker

這樣的<ng-template let-item>...</ng-template>內,您可以使用所需的表達

+0

第一個看起來不再工作。除了更改爲'ng-template'之外,我無法弄清楚爲什麼它不適合我。它沒有給我任何東西,但是當我使用錯誤的let-*屬性時會出錯。 – TrySpace

相關問題