2017-02-22 25 views
4

Я новичок в angular2. мой код выглядит следующим образом:Доступ к элементу DOM в Angular 2 и изменение атрибута класса элемента

import { Component, OnInit } from '@angular/core'; 

@Component({ 
    selector: 'main', 
    template: ` 
    <div class="current"> 
    </div> 
    ` 
}) 

export class MainComponent implements OnInit { 
    ngOnInit(): void { 
    //change the div class from current to next... 
    } 
} 

Я хотел бы изменить класс div с 'current' на 'next'.

Уместно, если вы сообщите мне, что это лучший способ сделать это?

ответ

5

Один из вариантов заключается в использовании template reference variable.

В приведенном ниже примере ссылочная переменная #target добавлена ​​в нужный элемент, а затем decorator @ViewChild (@ViewChild('target') target) позволяет получить доступ к переменной в вашем компоненте.

Оттуда вы можете получить ссылку на элемент DOM, обратившись к переменной nativeElement property.

Вот пример, в котором обновляется имя класса:

import { Component, AfterViewInit, ViewChild } from '@angular/core'; 

@Component({ 
    selector: 'main', 
    template: ` 
    <div #target class="current"> 
    </div> 
    ` 
}) 
export class MainComponent implements AfterViewInit { 
    @ViewChild('target') target; 

    constructor() { } 

    ngAfterViewInit(): void { 
    let element = this.target.nativeElement; 

    element.className = 'next'; 
    } 
} 

Тем не менее, стоит отметить, что вы можете работать с большинством манипуляции DOM с наращиванием в директивах DOM. В этом случае вы можете просто использовать ngClass directive для привязки переменной с атрибутом класса:

import { Component, AfterViewInit } from '@angular/core'; 

@Component({ 
    selector: 'main', 
    template: ` 
    <div [ngClass]="targetClass"> 
    </div> 
    ` 
}) 
export class MainComponent implements AfterViewInit { 
    private targetClass: string = 'current'; 

    constructor() { } 

    ngAfterViewInit(): void { 
    this.targetClass = 'next'; 
    } 
} 
+0

Спасибо, Джош, за быстрый ответ. он работает красиво. – mohsen

+0

Есть ли какая-то особая причина, по которой вы предложили «@ViewChild (« target ») target; вместо явно заданной цели @ViewChild ('target'): QueryList ;'? –

+0

вы также можете использовать privateHostBinding ('class') private TargetClass для обработки изменения класса. –

 Смежные вопросы

  • Нет связанных вопросов^_^