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, время: 09:26. |