DifferentUntilChanged () не работает должным образом в angular 6 - PullRequest
0 голосов
/ 31 августа 2018

У меня есть метод, который возвращает наблюдаемое следующим образом

constructor(private _http: HttpClient) {}

getUsers(location){
   return this._http.get(`https://someurl?location=${location}`)
          .pipe(
              map((response: any) => response),
              distinctUntilChanged()
           )
}

(Пожалуйста, примите во внимание, что все необходимые зависимости импортированы)

Итак, чтобы отобразить результат пользователей, я вызываю метод loadUsers.

loadUsers(location){
   this.getUsers(location).subscribe( users => {
       this.userList = users;
    });
}

ngOnInit(){
    this.loadUsers('mumbai');
}

Таким образом, приведенный выше код загружает список пользователей для меня, для всех пользователей, которые имеют местоположение Мумбаи.

Теперь у меня есть список местоположений в пользовательском интерфейсе с флажком рядом с ним, как

Mumbai,
Delhi,
Kerala

Таким образом, нажатие на одно местоположение вызовет метод loadUsers с именем местоположения в качестве параметра.

Поэтому, когда я снова нажимаю на Мумбаи из флажка (перед тем, как щелкнуть любой другой флажок, кроме Мумбаи), я не хочу снова загружать пользователей, принадлежащих Мумбаи, так как он уже был загружен при загрузке.

Я прочитал, что в таких случаях можно использовать DifferentUntilChanged (). Однако, похоже, это не работает для меня, так как, когда я выбираю Mumbai из списка флажков, он все равно попадает в вызов loadUsers из Mumbai

PS - Это не реальный вариант использования. Приведенное выше описание является лишь попыткой разъяснить мою проблему всем вам.

Я новичок в Angular и Rxjs. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 31 августа 2018

ваш distinctUntilChanged применяется к ответу this._http.get() возвращается. Если вы хотите предотвратить повторный вызов getUsers() для того же местоположения, вам придется немного переписать свой код, чтобы ваш список местоположений был заметен // выдвинуть местоположение next в тему, чтобы вы могли использовать distinctUntilChanged на этот список ввода.

const currentLocation = new Subject();
on('click', () => currentLocation.next(this.value)); // on your location list items checkboxes

currentLocation.pipe(
  distinctUntilChanged(),
  mergeMap(location => loadUsers(location)
)
.subscribe(users => {
  this.userList = users;
});

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

...