Unraveling Angular 2 Buch, Kapitel 1, Beispiel 5

Die Seite enthält eine Liste mit Tauchgängen. Sie enthält die Optionen "Neuen Tauchgang hinzufügen", "Tauchgänge löschen" und ein Suchfeld, mit dem die angezeigte Liste während der Eingabe gefiltert wird.

Dies ist die Vorlage:

<div class="container-fluid">

  <h1>My Latest Dives (Angular/TypeScript)</h1>
  <div class="row">
    <div class="col-sm-5">
      <button class="btn btn-primary btn-lg"
        [disabled]="!enableAdd()"
        (click)="addDive()">
          Add new dive
      </button>
      <button class="btn btn-danger btn-lg"
        (click)="clearDives()">
          Clear dives
      </button>
    </div>
    <div class="col-sm-4 col-sm-offset-3">
      <input #searchBox class="form-control input-lg"
        placeholder="Search"
        (keyup)="0" />
    </div>
  </div>
  <div class="row">
    <div class="col-sm-4"
      *ngFor="let dive of dives | contentFilter:searchBox.value">
      <h3>{{dive.site}}</h3>
      <h4>{{dive.location}}</h4>
      <h2>{{dive.depth}} feet | {{dive.time}} min</h2>
    </div>
  </div>
</div>

Dies ist der Komponentencode:

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

@Component({
  selector: 'divelog',
  templateUrl: 'app/dive-log.template.html'
})

export class DiveLogComponent {
  public dives = [];
  private _index = 0;
  private _stockDives = [
  {
    site: 'Abu Gotta Ramada',
    location: 'Hurghada, Egypt',
    depth: 72,
    time: 54
  },
  {
    site: 'Ponte Mahoon',
    location: 'Maehbourg, Mauritius',
    depth: 54,
    time: 38
  },
  {
    site: 'Molnar Cave',
    location: 'Budapest, Hungary',
    depth: 98,
    time: 62
  }];

  public enableAdd() {
    return this._index < this._stockDives.length;
  }

  public addDive() {
    if (this.enableAdd()) {
      this.dives.push(this._stockDives[this._index++]);
    }
  }

  public clearDives() {
    this.dives = [];
    this._index = 0;
  } 
}

Dies ist der Filtercode:

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({name: 'contentFilter'})
export class ContentFilterPipe implements PipeTransform {

  transform(value: any[], searchFor: string) : any[] {
    if (!searchFor) return value;

    searchFor = searchFor.toLowerCase();
    return value.filter(dive => 
      dive.site.toLowerCase().indexOf(searchFor) >= 0 ||
      dive.location.toLowerCase().indexOf(searchFor) >= 0 ||
      dive.depth.toString().indexOf(searchFor) >= 0 ||
      dive.time.toString().indexOf(searchFor) >= 0);
  }
}

Der Filter wird aufgerufen und die Liste wird bei jeder Eingabe in das Suchfeld neu gerendert, jedoch nicht, wenn ich auf die Schaltfläche "Hinzufügen" klicke. Wenn ich etwas im Suchfeld habe, führt die Schaltfläche "Hinzufügen" nicht zur Änderung der Tauchliste, obwohl der Inhalt des Suchfelds die Anzeige der neuen Elemente ermöglicht. Wie ändere ich den Code so, dass durch Klicken auf die Schaltfläche "Hinzufügen" die angezeigte Liste der Tauchgänge erneut gerendert wird?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage