Angular 2. Фильтрация с RxJs
Хочу реализовать простейший фильтр списка. За основу взял один из туториалов из документации. Но мне нужно немного изменить поведение: если в туториале с пустым текстовым полем список получается пустой, то мне нужно, чтобы в этом в списке после загрузки страницы выводились все элементы массива.
Вот темплейт: <div> <input #searchBox id="search-box" type="text" (keyup)="search(searchBox.value)"/> <ul> <li *ngFor="let contact of displayedContacts | async" class="contact"> <span>{{contact.name}}</span> </li> </ul> </div> Часть кода компонента: contacts: Array<any>; displayedContacts: Observable<any[]>; private searchTerms = new Subject<string>(); ... this.displayedContacts = this.searchTerms .debounceTime(300) .distinctUntilChanged() .switchMap(term => this.filterContacts(term)) .catch(error => { console.log(error); return Observable.of<any[]>([]); }); ... search(term: string): void { this.searchTerms.next(term); } То что мне нужно пока получается добиться с помощью такого кода: setTimeout(()=>{ this.searchTerms.next(""); }, 1500); Но должен быть нормальный способ это сделать. |
Digan,
Метод filterContacts еще покажи. В ngOnInit компонента не получится вынести прокидывание нужного тебе значения? this.searchTerms.next(""); Или делай через BehaviorSubject с установкой нужного тебе значения при создании. |
Цитата:
private searchTerms = new BehaviorSubject<string>(""); Получается Subject получается нельзя также инициализировать. Общий вопрос по rxJs. За счет чего при использовании этой библиотеки не блокируется страница при перестройки dom? У меня в списке 3 тыс. элементов. Если rxJs не использовать, то при фильтрации происходит кратковременное но подвисание при перестройке dom. |
Digan,
Цитата:
Цитата:
Ну и не забываем использовать trackBy вместе с директивой ngFor. |
Цитата:
|
Цитата:
_.debounce = function(func, wait, immediate) { var timeout, result; var later = function(context, args) { timeout = null; if (args) result = func.apply(context, args); }; var debounced = restArgs(function(args) { if (timeout) clearTimeout(timeout); if (immediate) { var callNow = !timeout; timeout = setTimeout(later, wait); if (callNow) result = func.apply(this, args); } else { timeout = _.delay(later, wait, this, args); } return result; }); debounced.cancel = function() { clearTimeout(timeout); timeout = null; }; return debounced; }; |
destus,
зачем нужно в 10 строке проверка и в 24 строке обнуление? |
рони,
Цитата:
|
Цитата:
Цитата:
Цитата:
|
b]рони[/b],
Можно и так. Но в моем случае был копипаст с исходников библиотеки. |
Часовой пояс GMT +3, время: 20:10. |