เชิงมุม - สังเกตได้ชัดเจนเมื่อคลิก

จากการค้นหาในบทช่วยสอนฮีโร่ของ angular.io ฉันได้สร้างการค้นหาสัตว์อย่างง่ายโดยใช้สิ่งที่สังเกตได้ ทุกอย่างทำงานได้ดี แต่ตอนนี้ฉันต้องการล้างค่าในการค้นหา และล้างรายการผลลัพธ์เมื่อฉันเลือกผลลัพธ์

ฉันได้สร้างวิธีการล้างค่าอินพุตเมื่อคลิกลิงก์ โดยคาดหวังว่าสิ่งที่สังเกตได้จะอัปเดตและล้าง แต่น่าเสียดายที่มันไม่เกิดขึ้น และรายการแบบเลื่อนลงยังคงอยู่ ฉันได้ลองกำหนดสิ่งที่สังเกตได้ใหม่ซึ่งใช้งานได้ แต่สิ่งที่สังเกตได้นั้นถูกยกเลิกการสมัคร ซึ่งเป็นสิ่งที่ฉันไม่ต้องการทำ

ฉันแน่ใจว่านี่เป็นกรณีของฉันที่ยังไม่เข้าใจวิธีการทำงานกับสิ่งที่สังเกตได้อย่างสมบูรณ์ ดังนั้นหวังว่าพวกคุณจะช่วยฉันได้

ขอบคุณ นี่คือรหัสของฉัน

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

import {Observable, Subject} from 'rxjs'

import {
  debounceTime, distinctUntilChanged, switchMap
} from 'rxjs/operators';

import { AnimalService } from '../services/animal.service';
import { Animal } from '../models/animal';

@Component({
  selector: 'app-animal-search',
  templateUrl: './animal-search.component.html',
  styleUrls: ['./animal-search.component.css']
})
export class AnimalSearchComponent implements OnInit {
  animals$: Observable<Animal[]>;
  private searchTerms = new Subject<string>();
  private searchTerm: string;

  constructor(private animalService: AnimalService) { }

  search(term: string):void {
    this.searchTerms.next(term);
  }

  ngOnInit() {
    this.animals$ = this.searchTerms.pipe(

      debounceTime(300),

      distinctUntilChanged(),

      switchMap((term: string) => this.animalService.searchAnimals(term)),
    );

    this.animals$.subscribe( )
  }

  clearSearch()
  {
    //PART THAT ISNT WORKING
    this.searchTerm = "";
    this.searchTerms = new Subject<string>();
  }

}
<div id="search-component" class="search-component-container">
  <input #searchBox id="search-box" [(ngModel)]="searchTerm"  (keyup)="search(searchBox.value)" class="search-component-input" />

  <ul class="search-result">
    <li *ngFor="let animal of animals$ | async" >
      <a routerLink="/animal/{{animal.id}}" (click)="clearSearch()"> 
        {{animal.Name}}
      </a>
    </li>
  </ul>
</div>

person LozBlake15    schedule 28.08.2018    source แหล่งที่มา


คำตอบ (2)


ไม่แน่ใจว่าคุณกำลังพยายามบรรลุผลอะไร แต่จากคำถามของคุณ ดูเหมือนว่าคุณต้องการทำสิ่งต่อไปนี้:

clearSearch()
{
  this.searchTerms.next('');
}

ขึ้นอยู่กับผลลัพธ์ที่คุณต้องการ คุณสามารถทำสิ่งต่อไปนี้ได้เช่นกัน:

  initAnimals() {
    if (this.animals$) {
      this.animals.unsubscribe();
    }

    this.animals$ = this.searchTerms.pipe(
      debounceTime(300),
      distinctUntilChanged(),
      switchMap((term: string) => this.animalService.searchAnimals(term)),
    );

    this.animals$.subscribe( )
  }

  ngOnInit() {
    this.initAnimals();
  }

  clearSearch() {
    this.initAnimals();
  }
person peinearydevelopment    schedule 28.08.2018
comment
ฉันคิดว่า this.searchTerms.next(''); เป็นทางออกที่สำคัญ ใน 'ส่วนที่สอง' ของคุณ คุณกำลังสร้างหัวเรื่องใหม่และการสมัครทุกครั้งที่มีการล้างอินพุต ซึ่งฉันไม่คิดว่าจำเป็น - person Rich; 29.08.2018
comment
ฉันแค่ต้องการล้างข้อความที่ฉันพิมพ์ลงในอินพุต และรายการผลลัพธ์ UL ที่สร้างขึ้นโดยการค้นหาครั้งก่อน (ดังแสดงในรูปแรก) หาก UL ถูกผูกไว้กับรหัสอาร์เรย์แบบง่าย เพียงแค่ล้างรายการทั้งหมดในอาร์เรย์ แต่เนื่องจากเป็นสิ่งที่สังเกตได้จึงเป็นไปไม่ได้ ฉันจะลองดู .next('')! - person LozBlake15; 29.08.2018
comment
ทำการรักษาและง่ายมาก ขอบคุณ ติดตามผลอย่างรวดเร็ว เมื่อเชื่อมต่อกับบริการ http สิ่งนี้จะทำให้เกิดการเรียกเซิร์ฟเวอร์เพิ่มเติม หรือ rxjs ฉลาดพอที่จะจัดการสิ่งนั้น - person LozBlake15; 29.08.2018
comment
มันจะเรียกใช้บริการอีกครั้ง แต่คุณเพียงอัปเดต switchMap ของคุณเป็นดังนี้: switchMap((term: string) => { if (term) this.animalService.searchAnimals(term);}) เพื่อจัดการกับสถานการณ์นั้น - person peinearydevelopment; 29.08.2018

เมื่อคุณทำ

this.searchTerms = new Subject<string>();

คุณกำลังสูญเสียหัวเรื่องที่คุณได้กำหนดค่าไพพ์ไว้ใน onInit เนื่องจากนี่เป็นอินสแตนซ์หัวเรื่องใหม่ล่าสุด

คุณสามารถปล่อยค่าถัดไปเพื่อล้างข้อมูลโดยใช้ subject.next

person Antoniossss    schedule 28.08.2018