2017-12-12 19 views
0

유형 문자열 배열의 관찰 가능 항목을 검색/필터링하려면 어떻게합니까?Observable onKeyUp을 어떻게 필터링 할 수 있습니까?

예를 들어

, 내가

names$ = Observable.of(['Lenovo','Dell','Toshiba','Apple','Microsoft']); 

가 지금은에 따라이 관찰을 필터링하고 싶은 관찰 다음 한 입력 텍스트 상자에 어떤 사용자 유형.

그래서 다음 코드가 있습니다 & 입력 상자에 입력 한 사용자의 searchTerm을 기준으로 필터링 된 관찰 가능을 반환하고 싶습니다.

클라이언트 측 솔루션을 찾고 있습니다. 데이터를 필터링하기 위해 서버에서 검색어를 전송할 수없는 이유로 클라이언트 측에 이미 데이터가 있습니다 &. 나는 또한이 예제에서 직접 배열 자체에 필터를 사용할 수 있지만 이것을 관찰 가능하게하고 싶다고 생각한다.

또한 flatmap 연산자를 사용해 배열을 평평하게 만들었지 만, 문자열 배열 형식의 끝에있는 관찰 가능 항목을 반환 할 수 없었습니다.

도움이 될 것입니다. 미리 감사드립니다.

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

@Component({ 
    selector: 'my-app', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent implements OnInit { 
    names$: Observable<string[]>; 
    filteredNames$: Observable<string[]>; 
    searchTerm: string; 

    ngOnInit() { 
     this.names$ = Observable.of(['Lenovo', 'Dell', 'Toshiba', 'Apple', 'Microsoft']); 
    } 

    // HOW TO IMPLEMENT THIS FUNCTION ?? 
    onkeypress(value) { 
     console.log(value); 
     this.names$ = this.names$.map(names => names.indexOf(value) > 0) 
     // .filter(x=>{console.log(x.indexOf(value));return x.indexOf(value)>0}) 
     //  .subscribe(
     // (data)=>console.log(data),  (error)=>console.log('Error'+error), 
     //  ()=>console.log('complete')); 
    } 
} 
+0

이것은 작은 일이지만이 키 누르기 이벤트를 수신하고 함수의 keyup를 호출하고 있습니다. 네가 여기서 원하는 행동을 할 지 모르겠다. –

+0

@Brendan Whiting 실수를 지적 해 주셔서 감사합니다. 나는 그것을 고쳤다. – hp8888

답변

1

당신이 할 몇 가지 실수가 있습니다 .

  1. 왜 관측치를 names.indexOf(value) > 0으로 매핑 하시겠습니까? .map()은 사실대로 관측 가능을 변환하며 string 유형의 관측 가능 항목을 캐스팅하여 boolean을 입력했습니다. 당신은 사용자가 (onKeyUp에) 키 입력 할 때 names의 목록을 변경하려면

  2. , 왜 당신이 this.names$ 다시 this.names$에 재 할당 하시겠습니까? 그러면 코드가 첫 번째 키 스트로크에서만 작동합니다. 두 개의 변수가 있어야합니다. 하나는 값을 보유하고 다른 하나는 ngModel에 바인드됩니다.

  3. async 파이프를 사용하려는 경우 입력 스크립트에서 관찰 가능 항목을 구독 할 필요가 없습니다.당신의 onKeyUp 기능

    ngOnInit() { 
        this.data$ = Observable.of(['Lenovo', 'Dell', 'Toshiba', 'Apple', 'Microsoft']); 
        this.names$ = this.data$; 
    } 
    

    당신이 async 파이프를 사용하는 가정이되어야합니다 :

    당신의 ngOnInit()에서

, 당신의 이름을 추적하기 위해 변수를 생성

onKeyUp(value) { 
    this.names$ = this.data$ 
     .map(x => { 
      return x.filter(y=>y.toLowerCase().indexOf(value.toLowerCase())>-1); 
     }) 
} 

작업 Stackblit S : https://stackblitz.com/edit/angular-yeaer6

+0

도움을 주셔서 감사합니다. 내가 언급 한 모든 의견을 이해하고 코드를 업데이트하고 keypress 이벤트를 수정했습니다. 다음은 여기에 언급 한 것을 정확히 수행하는 stackblitz 링크입니다 .https : //stackblitz.com/edit/angular-wtarys 그러나 텍스트를 변경할 때 필터링 된 목록이 업데이트 될 것으로 예상되지만 수행하지는 않습니다. 왜 그런가? – hp8888

+0

@ hp8888 내 잘못입니다. 코드를 업데이트하고 stackblitz를 게시했습니다. – CozyAzure

+0

,,,, 불행하게도 그것은 여전히 ​​작동하지 않거나 그것이 내가하는대로 꼭 작동 코드가 있어야 링크 인 https://stackblitz.com/edit/angular-yeaer6에 갔다 동작하지 않습니다. 그러나 필자가 텍스트 상자에 'Del'을 입력하면 필터링 목록에없는 Dell이 표시됩니다. 미안하지만이 점을 지적해야합니다. 마찬가지로 'Len'을 입력하면 필터링 된 목록에 Lenovo가 표시됩니다. 이 링크를 보내기 전에 변경 사항을 저장하는 것을 잊었을 수 있습니까? – hp8888

1

App.component.html

<!-- Textbox to receive user input --> 
Search:<input type='text' [(ngModel)]='searchTerm' (keypress)='onkeypress($event.target.value)'> 
<p>Search Term: {{searchTerm}}</p> 
<hr> 

<!-- Show search results here as ordered list --> 
<ng-container *ngIf='(names$|async)?.length>0'> 
    <ol> 
     <li *ngFor='let name of names$|async'> 
      {{name}} 
     </li> 
    </ol> 
</ng-container> 

App.component.ts 노력이

let value='Del' 
Rx.Observable.from(['Lenovo','Dell','Toshiba','Apple','Microsoft']) 
.filter(name=>name.indexOf(value)!==-1) 
.subscribe(console.log); 
+0

안녕하세요, Fan Cheung, 제 질문에 답변 해 주셔서 감사합니다. 난 당신이 여기에 코드를 시도하고 완벽하게 잘 작동합니다. 그러나 나는 하나의 질문이있다. Observable.from을 Observable로 변경하는 순간 작동이 멈췄습니다. 당신은 다음과 같은 작업 (I 대신에서의 방법을 호출 통지)하지 않는 이유를 설명시겠습니까? '하자 값 = "델"' 'Rx.Observable.of ([ "레노버", "델", "도시바", " 애플 ","마이크로 소프트 "])' '.filter (이름 => name.indexOf (값) == - 1)' '.subscribe (CONSOLE.LOG이)!' – hp8888

+0

가 .of 당신에게 전체 목록을 보내드립니다 (어레이) .subscribe (console.log)와 (array) .subscribe (console.log)를 시도해보고 차이점을 확인하십시오. –