Rxjs - DistinctUntilChanged () с событием keyup - PullRequest
0 голосов
/ 07 июня 2018

Я использую Rxjs 6, который фильтрует наблюдаемое, возвращаемое Firebase на основе события (keyup) в поле формы.

У меня проблема, когда пользователь продолжает нажимать клавишу Backspace, пока в значении нет значенияполе формы, то выглядит, что наблюдаемое постоянно обновляется.

Добавление канала с помощью DistinctUntilChanged () неэффективно:

Функция фильтра Typescript:

updateFilter2() {
    const val = this.filteredValue.toLowerCase().toString().trim();

    if (this.filteredValue) {
        this.loadingIndicator = true;
        this.rows = this.svc.getData()
            .pipe(
                distinctUntilChanged(),
                debounceTime(300),
                map(_co => _co.filter(_company =>
                    _company['company'].toLowerCase().trim().indexOf(val) !== -1 || !val
                    ||
                    _company['name'].toLowerCase().trim().indexOf(val) !== -1 || !val
                    ||
                    _company['gender'].toLowerCase().trim().indexOf(val) !== -1 || !val
                )),
                tap(res => {
                    this.loadingIndicator = false;
                })
            );
    }
    else {
        this.rows = this.svc.getData()
            .pipe(distinctUntilChanged())
        this.loadingIndicator = false;
    }

    this.table.offset = 0;
}

Шаблон HTML:

<mat-form-field style="padding:8px;">
    <input
            type='text'
            matInput
            [(ngModel)] = "filteredValue"
            style='padding:8px;margin:15px auto;width:30%;'
            placeholder='Type to filter the name column...'
            (input)='updateFilter2()'
    />
</mat-form-field>

У меня есть Stackblitz, воспроизводящий поведение: https://stackblitz.com/edit/angular-nyqcuk

Есть ли другой способ решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 07 июня 2018

Проблема в том, что ВСЕГДА делают getData.Сначала вы смотрите на изменения, затем переключитесь, чтобы получить данные.Таким образом, вы должны иметь наблюдаемые изменения.Используйте «FormControl», а не ввод с [(ngModel)]. Итак, в вашем .html

<input type="text" [formControl]="search">

код должен быть

  search= new FormControl();       //Declare the formControl

  constructor() {}

  ngOnInit() {
    this.search.valueChanges.pipe(
         debounceTime(400),
         distinctUntilChanged(),
         tap((term)=>{
              //here the value has changed
              this.loadingIndicator = true;
         }),
         switchMap(filteredValue=> {
              //We not return the value changed, 
              return this.svc.getData().pipe(
                     map(_co => {
                         return _co.filter(...)
                     }),
                     tap(()=>{
                         this.loadingIndicator=false;
                     }))
          })).subscribe(result=>{
             this.result=result
          })
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...