Угловой 2 - Выберите элемент с щелчком (добавьте "активный" класс и удалите его из родных братьев)

В нижеприведенном фрагменте кода у меня есть элементы списка. При щелчке мыши я хотел бы выбрать этот элемент (добавьте "активный" класс и отмените выбор, если какие-либо другие элементы (братья и сестры) выбраны remove'active классом. Я достиг того же, используя jQuery (полный код ниже). функциональность в угловом режиме 2.

Фрагмент кода:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="#" onclick="location.href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'; return false;">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<ul id="grouplist" class="list-group">
    <li class="list-group-item">Item1</li>
    <li class="list-group-item">Item2</li>
    <li class="list-group-item">Item3</li>
    <li class="list-group-item">Item4</li>
    <li class="list-group-item">Item5</li>
    <li class="list-group-item">Item6</li>
    <li class="list-group-item">Item7</li>
    <li class="list-group-item">Item8</li>
    <li class="list-group-item">Item9</li>
    <li class="list-group-item">Item10</li>
</ul>
<script>
$(function () {
    $('.list-group li').click(function() {
        $(this).addClass('active').siblings().removeClass('active');
    });
})
</script>
</body>
</html>

JSFiddle здесь

Angular 2 Experiment: Я могу установить класс через setElementClass. Как удалить "активный" класс у братьев и сестер? Или есть другие подходы?

Компонент просмотра списка (test1.component.html):

<h2>Select List Item</h2>

<ul id="grouplist" class="list-group">
    <li class="list-group-item" (click)="listClick($event)" *ngFor="let item of groups">
        {{ item.name }}
    </li>
</ul>

Код TypeScript (test1.component.ts):

import { Component } from '@angular/core';
import { Renderer } from '@angular/core';
import { Group } from './group';

@Component({
    selector: 'test1',
    template: require('./test1.component.html')
})
export class Test1Component {

    groups: Group[];

    constructor(private render: Renderer) {
        this.groups = [new Group("item1"), new Group("item2"), new Group("item3"), new Group("item4"), new Group("item5")];
    }

    public listClick(event: any) {
        event.preventDefault();
        this.render.setElementClass(event.target, "active", true);
        // How to remove 'active' from siblings ?
    }
}

group.ts

export class Group {
    constructor(public name: String) {
    }
}

Ответ 1

Вы можете использовать ngClass для того, что вы ищете:

 <ul id="grouplist" class="list-group">
     <li class="list-group-item" [ngClass]="{'active': selectedItem == item}" (click)="listClick($event, item)" *ngFor="let item of groups">
        {{ item.name }}
     </li>
</ul>

И в вашем listClick просто установите выбранный элемент в этот элемент:

listClick(event, newValue) {
    console.log(newValue);
    this.selectedItem = newValue;  // don't forget to update the model here
    // ... do other stuff here ...
}

Ответ 2

Вы также можете просто передать индекс элемента li вашему компоненту во время события click:

<ul id="grouplist" class="list-group">
   <li *ngFor="let item of items; let i=index" (click)="select(i)" 
       [ngClass]="{'active': selectedIndex == i, 'list-group-item': true}" >
      {{ item.text }}
   </li>
</ul>

Затем пусть компонент устанавливает свойство selectedIndex:

@Component({
  ...
})
export class ItemListComponent {
  ...
  selectedIndex: number;
  select(index: number) {
      this.selectedIndex = index;
  }
}

selectedIndex используется шаблоном для определения того, следует ли присвоить active класс элементу li.

Смотрите это в этом Plunker

Ответ 3

Для тех, кто не убежден в принятом решении и идет с фона AngularJS, вот решение для вас.

HTML:

<li *ngFor="let quality of qualities" 
    [ngClass]="quality.id === activeElement ? 'active' : 'none'"
    (click)="selectedItem(quality.id)"
    >
  {{quality.quality}}
</li>

CSS:

.active {
  background-color: #000000;
  color : #ffffff;
}

Компонент:

public activeElement = 1;  
public selectedItem(id) {
    this.activeElement = id;
 }

Примечание. Моя коллекция ngFor похожа на qlist = [{quality: "Обо мне", id: 1}] Итак, я использую quality.id для переключения класса, вы можете использовать свой собственный атрибут для переключения. Просто измените переменную activeElement на то, что вы хотите сделать по умолчанию.

Ответ 4

<ul id="grouplist" class="list-group">
     <li class="list-group-item" [ngClass]="{'active': selectedItem == item}" 
     (click)="listClick($event, item)" *ngFor="let item of groups">
        {{ item.name }}
     </li>
    </ul>
listClick(event, newValue) {
     console.log(newValue);
     this.selectedItem = newValue;  // don't forget to update the model here
     // ... do other stuff here ...
    }