Как добавить класс к элементу при наведении?

Как добавить класс в div, когда завис на div.

Шаблон -

<div class="red">On hover add class ".yellow"</div>

Составная часть -

import {Component} from 'angular2/core';

@Component({
  selector: 'hello-world',
  templateUrl: 'src/hello_world.html',
  styles: ['
    .red {
      background: red;
    }

    .yellow {
      background: yellow;
    }

  ']
})
export class HelloWorld {
}

демонстрация

[ПРИМЕЧАНИЕ - я специально хочу добавить новый класс, а не изменять существующие классы]

Вздох! Это такой нормальный вариант использования, и я пока не вижу прямого решения!

Ответ 1

Вы также можете просто использовать что-то вроде:

[ngClass]="color" (mouseover)="changeStyle($event)" (mouseout)="changeStyle($event)"

Тогда в компоненте

color:string = 'red';

changeStyle($event){
  this.color = $event.type == 'mouseover' ? 'yellow' : 'red';
}

Plunker

В качестве альтернативы, сделайте все в разметке:

[ngClass]="color" (mouseover)="color='yellow'" (mouseout)="color='red'"

Ответ 2

Просто, как показано ниже

<button [class.btn-success]="mouseOvered" 
  (mouseover)="mouseOvered=true"
  (mouseout)="mouseOvered=false"> Hover me </button>

LIVE DEMO

Ответ 3

Если вы устанавливаете стили программно (например, из атрибута в компоненте) и хотите, чтобы он изменялся при наведении, вы можете посмотреть эту демонстрацию Plunker.

Он также отвечает на вопрос, когда несколько элементов должны реагировать на событие mouseover.

Вот код:

@Component({
    selector: 'app',
    template: `
    <div id="1" 
      (mouseover)="showDivWithHoverStyles(1)" 
      (mouseout)="showAllDivsWithDefaultStyles()" 
      [ngStyle]="hoveredDivId ===1 ? hoveredDivStyles : defaultDivStyles">
      The first div
    </div>

    <div id="2" 
      (mouseover)="showDivWithHoverStyles(2)" 
      (mouseout)="showAllDivsWithDefaultStyles()" 
      [ngStyle]="hoveredDivId === 2 ? hoveredDivStyles :  defaultDivStyles">
      The second div
    </div>`
})
class App{
  hoveredDivId;
  defaultDivStyles= {height: '20px', 'background-color': 'white'};
  hoveredDivStyles= {height: '50px', 'background-color': 'lightblue'};

  showDivWithHoverStyles(divId: number) {
    this.hoveredDivId = divId;
  }

  showAllDivsWithDefaultStyles() {
    this.hoveredDivId = null;
  }
}

Ответ 4

@HostListener Декоратор также является хорошим вариантом, если вы применяете весь компонент.

сохранить html как есть, а в компоненте добавить @HostListener

  <div class="red">On hover add class ".yellow"</div> 

  @HostListener('mouseenter') onMouseEnter() {
    this.elementRef.nativeElement.class = 'red';
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.elementRef.nativeElement.class = 'yellow';
  }