2015-11-18 7 views
22

Ho creato un ul e desidero impostare la classe solo sul primo elemento li.Angular2 come impostare il nome della classe dell'elemento quando si utilizza ng-for, solo sul primo elemento

Voglio impostare il class="active" solo sul primo li. Ottengo l'indice nell'attributo della classe, ma non è quello che voglio.

import { Component, View, NgFor,Inject,forwardRef,Input, NgIf, FORM_DIRECTIVES } from 'angular2/angular2'; 
 
@Component({ 
 
    selector: 'tabs' 
 
}) 
 
@View({ 
 
    template: ` 
 
     <ul> 
 
      <li *ng-for="#tab of tabs;#index = index" class="{{index}}" (click)="selectTab(tab)">{{tab.tabTitle}}</li> 
 
     </ul> 
 
     <ng-content></ng-content> 
 
    `, 
 
    directives: [NgFor] 
 
}) 
 

 
export class Tabs { 
 
    get tabs() { 
 
     return this._tabs; 
 
    } 
 

 
    set tabs(value) { 
 
     this._tabs = value; 
 
    } 
 
    private _tabs; 
 

 
    constructor() { 
 
     console.log("ctor.Tabs"); 
 
     this._tabs = []; 
 
    } 
 

 
    selectTab(tab) { 
 
     this._tabs.forEach((tab) => { 
 
      tab.active = false; 
 
     }); 
 
     tab.active = true; 
 
    } 
 

 
    addTab(tab: Tab) { 
 
     if (this._tabs.length === 0) { 
 
      tab.active = true; 
 

 
     } 
 
     else { 
 
      tab.active = false; 
 
     } 
 
     this._tabs.push(tab); 
 
    } 
 
} 
 

 
@Component({ 
 
    selector: 'tab', 
 
    properties: ['tabTitle: tab-title'] 
 
}) 
 
@View({ 
 
    template: ` 
 
    <div [hidden]="!active" [class]="active"> 
 
     <ng-content/> 
 
    </div> 
 
    ` 
 
}) 
 
export class Tab { 
 
    @Input() index: number; 
 

 
    constructor(@Inject(forwardRef(() => Tabs)) tabs: Tabs) { 
 
     console.log("ctor.Tab") ; 
 
     tabs.addTab(this); 
 
     console.log(tabs); 
 
    } 
 

 
    get active() { 
 
     return this._active; 
 
    } 
 
    set active(value) { 
 
     this._active = value; 
 
    } 
 
    private _active; 
 

 

 
}

+0

'[class.active] =" indice == 0 "' –

+0

@Eric - Perfetto. Grazie. (fagli una risposta) – jeff

+0

Oh, ok, subito :) –

risposta

29

come richiesto dal @jeff

È possibile ottenere semplicemente usando questa linea

<li *ngFor="let tab of tabs; let index = index" [class.active]="index == 0" ...> 

Glad ha aiutato :)

Aggiornamento

Con beta 15 la variabile locale first è stato aggiunto, per cui la soluzione originale può essere riscritta come

<li *ngFor="let tab of tabs; let isFirst = first" [class.active]="isFirst" ...> 

Vedi Angular 2 - ngFor - local variable “first” does not work

+1

se voglio aggiungere 'is-active', come raggiungerlo? '[class ['is-active']] = isFirst' non funziona. – Hitmands

+1

@Hitmands '' '[ngClass] =" {'is-active': isFirst} "' '' – Guntram

+0

Non credevo davvero che avrebbe funzionato. BUUUT lo fa ... Quindi suppongo di dover studiare meglio la sintassi angolare ... Grazie per l'elegante soluzione :) – MartinJH

2

sintassi Hash mi dà Template parse errors (@angular 2.2.0) , Ho dovuto usare let invece.

<ul> 
    <li *ngFor="let item of items; let i = index; let firstItem = first; let lastItem = last" [ngClass]="{ active: firstItem }"> 
    {{ i }} {{ firstItem }} {{ lastItem }} {{ item }} 
    </li> 
</ul> 
Problemi correlati