2016-06-05 9 views
2

ich mehrere Klassen hinzufügen bin versucht, nachdem ich ein Symbol klicken in angular2setElementClass für mehrere Klassen in angular2

Dies ist mein Code:

import {Component, ElementRef, Renderer} from 'angular2/core'; 
import {CourseService} from './courses.service'; 
import {AutoGrowDirective} from './auto-grow.directive'; 

@Component({ 
    selector: 'courses', 
    template: `<i (click)="onclick($event)" class="glyphicon glyphicon-star"></i> 
       <h3>Courses</h3> 
       {{title}} 
       <input type="text" autoGrow/> 
       <ul> 
        <li *ngFor="#course of courses"> 
         {{course}} 
        </li> 
       </ul>`, 
    providers: [CourseService], 
    directives: [AutoGrowDirective] 
}) 
export class CoursesComponent { 
    title:string = "List of course"; 
    courses; 

    constructor(courseService:CourseService, private el:ElementRef, private renderer:Renderer) { 
     this.courses = courseService.getCourses(); 
    } 

    onclick($event) { 
     this.renderer.setElementClass(this.el.nativeElement, 'glyphicon glyphicon-star-empty', true); 
    } 
} 

Aber wenn ich auf dem Symbol Konsole meines Browser klicken wirft dieser Fehler:

EXCEPTION: Error during evaluation of "click" 

ich dachte, es ist, weil ein Raum zwischen den Klassen, was ich nicht verstehen konnte ich ist, wie kann ich mehrere Klassen in einem Elemente hinzufügen?

Antwort

4

Rufen Sie einfach this.renderer.setElementClass(...) für jede Klasse einzeln und stellen Sie den isAdd Parameter true

this.renderer.setElementClass(this.el.nativeElement, 'glyphicon', isAdd: true); 
this.renderer.setElementClass(this.el.nativeElement, 'glyphicon-star-empty', isAdd: true); 

(nicht getestet)

Update

@Component({ 
    selector: 'courses', 
    template: `<i (click)="onclick($event)" class="glyphicon glyphicon-star"></i> 
       <h3>Courses</h3> 
       {{title}} 
       <input type="text" autoGrow/> 
       <ul> 
        <li *ngFor="#course of courses"> 
         {{course}} 
        </li> 
       </ul>`, 
    providers: [CourseService], 
    directives: [AutoGrowDirective] 
}) 
export class CoursesComponent { 
    title:string = "List of course"; 
    courses; 

    constructor(courseService:CourseService) { 
     this.courses = courseService.getCourses(); 
    } 


    @HostBinding('class.glyphicon') 
    @HostBinding('class.glyphicon-star-empty') 
    _isGlyphIcon:boolean = false; 

    onclick($event) { 
     this._isGlyphIcon = true; 
    } 
} 

update2

@Component({ 
    selector: 'courses', 
    template: `<i (click)="onclick($event)" [ngClass]="_iconClasses"></i> 
       <h3>Courses</h3> 
       {{title}} 
       <input type="text" autoGrow/> 
       <ul> 
        <li *ngFor="#course of courses"> 
         {{course}} 
        </li> 
       </ul>`, 
    providers: [CourseService], 
    directives: [AutoGrowDirective] 
}) 
export class CoursesComponent { 
    title:string = "List of course"; 
    courses; 

    constructor(courseService:CourseService) { 
     this.courses = courseService.getCourses(); 
    } 

    _iconClasses:string[] = ['glyphicon', 'glyphicon-star']; 

    onclick($event) { 
     this._iconClasses = ['glyphicon', 'glyphicon-star-empty']; 
    } 
} 
+0

Vielen Dank, es funktioniert! Aber ich stehe vor einem anderen Problem, nämlich nach dem Klicken auf das Symbol, wird ein neues Symbol mit angehängten Klassen erstellt, anstatt die Klassen des vorhandenen Symbols zu ändern. Ich denke, etwas stimmt nicht mit meiner Bezugnahme auf das Element. –

+0

Wenn Sie die Klassennamen im Voraus kennen, verwenden Sie lieber '@HostBinding()' als 'renderer.setElementClass'. Der 'Renderer' bietet im Allgemeinen nur Methoden, um Dinge einzustellen, aber nicht um Dinge zu lesen. Das Ändern würde auch das Entfernen erfordern, was anscheinend nicht unterstützt wird. –

+0

immer noch das gleiche Ergebnis wie die frühere Lösung –