Использование RxJS объединитьПоследние для фильтрации наблюдаемых? - PullRequest
0 голосов
/ 27 сентября 2018

Я вижу, могу ли я использовать combineLatest в службе Angular для удаления блока коммутатора activeFiler$ (служба должна делать то же самое).Это компонент design прямо сейчас (ссылка на stackblitz) , и я пытаюсь удалить все свойства, кроме наблюдаемой render$:

export class TodosComponent implements OnInit {
  constructor(private ts:TodoService) {}
  render$: Observable<Todo[]>; 
  activeFilter$: Observable<VISIBILITY_FILTER>;


ngOnInit() {
  this.render$ = this.ts.selectedTodos$;
  this.activeFilter$ = this.ts.activeFilter$;

  this.activeFilter$.subscribe(active=>{
        switch (active) {
    case VISIBILITY_FILTER.SHOW_COMPLETED:
      this.render$ = this.ts.completeTodos$;
      break;
    case VISIBILITY_FILTER.SHOW_ACTIVE:
      this.render$ = this.ts.incompleteTodos$;
      break;
    default:
      this.render$ = this.ts.todos$;
      }
  });
}
  }
}

Как показано, я инициализировал this.render$ в Observable, возвращенный из файла todo.service.ts.Метод выглядит следующим образом:

  this.selectedTodos$ = 
  combineLatest(this.activeFilter$, this.completeTodos$, this.incompleteTodos$, this.todos$, this.applyFilter);

  private applyFilter(filter, completeTodos, incompleteTodos, todos): Todo[] {
    switch (filter) {
      case VISIBILITY_FILTER.SHOW_COMPLETED:
        return completeTodos;
      case VISIBILITY_FILTER.SHOW_ACTIVE:
        return incompleteTodos;
      default:
        return todos;
    }
  }

Итак, со всем этим, я думаю, я смогу удалить блок this.ts.ostore.observe(ACTIVE_FILTER_KEY).subscribe(active=>{ в компоненте todos, но если я удалил это, все приложение перестанет работать,

Одна странная вещь состоит в том, что если я закомментирую подписку $activeFilter и зарегистрирую это:

  this.render$ = this.ts.selectedTodos$;
  this.render$.subscribe(v=>console.log(v));

Когда я ввожу больше задач, они регистрируются, но не отображаются... есть идеи?

1 Ответ

0 голосов
/ 03 октября 2018

Я получил это работает.

Основная часть, которая заставляет его работать, состоит в том, что combineLatest излучает, когда каждый Observable излучает по крайней мере один раз.

В моем случае ReplaySubject<Todo[]> экземпляры, которые выполняли уведомления, не выполнялиуведомление об инициализации EStore и, следовательно, ReplaySubject<Todo[]> s никогда не сможет запустить оператор combinedLatest.

Я изменил реализацию EStore так, чтобы онаничего не излучать или объекты, с которыми EStore был инициализирован, и теперь он работает ... очень хорошо.

   changeDetection: ChangeDetectionStrategy.OnPush

Работает.Нам не нужны источники событий или @Input, чтобы он работал.Просто запросите магазин и позвольте ему творить чудеса.

...