Что делает машинописный код startWith('')?

Я изучаю Angular 5 с Typescript. Я пытаюсь реализовать автозаполнение углового материала, и я нашел следующий код, который мне очень непонятен:

this.filteredStates = this.stateCtrl.valueChanges
  .pipe(
    startWith(''),
    map(state => state ? this.filterStates(state) : this.states.slice())
  );

Полный код можно найти здесь: https://stackblitz.com/angular/mdokmnyajmd?file=app%2Fautocomplete-overview-example.ts

Я склонен думать, что когда в stateCtrl происходит изменение, он возвращает результат filterStates(state) тогда и только тогда, когда конкретный элемент был выбран в автозаполнении.

Чего я не понимаю, так это использования startWith('') ?! Почему бы просто не подписаться на вызов valueChanges?


person Anthony Hocquet    schedule 26.01.2018    source источник
comment
вы не слушаете сэр   -  person lazizanie    schedule 13.03.2021


Ответы (1)


valueChanges изначально не будет выдавать никаких значений (пока состояние фактически не изменится). Когда вам нужно что-то вычислить из начального состояния, вы используете startWith, чтобы заставить наблюдаемый выдавать значение, даже если обычно это не так.

Если вы хотите обработать начальное значение без startWith, вы можете создать другой поток

Observable.of(stateCtrl.value).pipe(
  map(state => state ? this.filterStates(state) : this.states.slice())
);

который выдаст только одно значение. Но проще обрабатывать оба случая одновременно, поэтому startWith - хороший способ сделать это...

person Sasxa    schedule 26.01.2018