2016-05-13 5 views
0

私はアコーデオンを実装するランディングページを持っています。アコーディオン内のグループ数は、プロパティ(タイトル、アクティブ...など)を定義するオブジェクトのリストによって管理されます。アコーディオンの各パネルには、特定のサブコンポーネントが含まれています。私は、次のようなグループを定義したいと思います:Angular2はオブジェクトのリストからサブコンポーネントをレンダリングします

@Component({ 
    selector: 'aa-home', 
    template: require('./home.component.html'), 
    styles: [require('./home.component.scss')], 
    directives: [ACCORDION_DIRECTIVES, QUOTE_COMPONENTS] 
}) 
export class HomeComponent implements OnInit { 
    public oneAtATime: boolean = true; 
    public groups: AccordianGroup[] = []; 

    constructor() { 
     this.groups.push(new AccordianGroup(true, 'Quote', 'quote', '<aa-quote (response)="onContinue($event)"></aa-quote>')); 
     this.groups.push(new AccordianGroup(false, 'Introduction', 'intro', '<aa-intro (response)="onContinue($event)"></aa-intro>')); 
     this.groups.push(new AccordianGroup(false, 'Applicant Information', 'applicant', '<aa-applicant (response)="onContinue($event)"></aa-applicant>')); 
     this.groups.push(new AccordianGroup(false, 'Details', 'details', '<aa-details(response)="onContinue($event)"></aa-details>')); 
     this.groups.push(new AccordianGroup(false, 'Review', 'review', '<aa-review (response)="onContinue($event)"></aa-review>')); 
     this.groups.push(new AccordianGroup(false, 'Payment', 'payment', '<aa-payment (response)="onContinue($event)"></aa-payment>')); 
    } 

    ngOnInit() { 
     console.log(_.capitalize('starting home')); 
    } 

    onContinue(message): void { 
     let index = _.findIndex(this.groups, function(x) { return x.name === message.componentName; }); 
     if (index < this.groups.length - 1) { 
      this.groups[index].isActive = false; 
      this.groups[index + 1].isActive = true; 
     } 
    } 

    toggleActive(group): void { 
     this.groups.forEach(function(x) { x.isActive = false; }); 
     group.isActive = !group.isActive; 
    } 
} 

class AccordianGroup { 
    constructor(
     public isActive: boolean, 
     public title: string, 
     public name: string, 
     public template: string 
    ) { } 
} 

このようなHTML:

<div *ngFor="let group of groups"> 
    <div class="accordion" (click)=toggleActive(group)>{{group.title}}</div> 
    <div class="panel" [ngClass]="{show: group.isActive}" [innerHTML]="group.template"></div> 
</div> 

これは動作しません...何もレンダリングされませんが。私はこれを間違った方法で行っているように感じますが、これを並べ替えることはできません。この背後にあるアイデアは、ユーザーに応じて...私はいくつかのグループをフィルタリングする必要があり、実際には... 1つの行を除いて全く同じコードを持つhtmlのダース以上のグループを持っていない配置される。これも可能ですか?

答えて

0

newでコンポーネントを作成することはできません。コンポーネントは、どちらかViewContainerRef.createComponent()例えばViewContainerRef.createComponent()

からのためのビューでHTMLからの角度によって作成されAngular 2 dynamic tabs with user-click chosen componentsを参照してください(それは非常に類似したユースケースです)

データ(モデル)を構築するマークアップからコンポーネントを作成するにはを親コンポーネントクラスに追加し、AccordianGroupのセレクタを使用して要素を作成します。

public groups: AccordianGroup[] = []; 
constructor() { 
    this.groups = [...]; 
... 
} 
<div *ngFor="let group of groups"> 
    <div class="accordion" (click)=toggleActive(group)>{{group.title}}</div> 
    <div class="panel" [ngClass]="{show: group.isActive}"><accordian-group [data]="group.data"></accordian-group></div> 
</div> 
+0

私は、オリジナルのポストを更新しました。サブコンポーネントが存在し、マークアップに各グループを明示的に追加すると機能します。画像のマークアップには多少の毛羽があります。そのため、ほとんどの場合、グループ間の唯一の違いは、サブコンポーネントが移動する1行です。重複したコードがたくさんあるようです。 – ASG

+0

'AccordianGroup'がコンポーネントの場合、これは動作しません。 –

+0

AccordionGroupは、元の投稿の最初のコードブロックの一番下に定義されているオブジェクトです。コンストラクタはグループを作成して初期化しています。各グループはサブコンポーネントに関連付けられており、そこで各グループに関連付けられたサブコンポーネントを出力する方法を見つけようとしています。 – ASG

関連する問題