【问题标题】:Filter Observable array based on FormControl value changes根据 FormControl 值变化过滤 Observable 数组
【发布时间】:2017-03-15 19:13:43
【问题描述】:

我正在尝试使用Observables 来呈现两个项目列表。一个是完整的结果,一个是过滤后的结果。

我有这个组件:

@Component({
    template: `
        <div *ngFor="let item of items | async">
            <span>{{item.name}}</span>
        </div>

        <input [formControl]="filterControl" />
        <div *ngFor="let item of filteredItems | async">
            <span>{{item.name}}</span>
        </div>
    `
})
export class TestComponent implements OnInit {
    private filterControl = new FormControl();
    private items: Observable<Item[]>;
    private filteredItems: Observable<Item[]>;

    ngOnInit() {
        this.items = this.dataService.get("items");

        this.filteredItems = this.filterControl.valueChanges
        .debounceTime(300)
        .distinctUntilChanged()
        .combineLatest(this.items, (filterValue, items) => {
            return items.filter((item: any) => item.name.toLowerCase().indexOf(filterValue.toLowerCase()) !== -1);
        });
    }
}

代码只会发送一个 http 请求,而不是每个键入的过滤器字母一个,这很好。然而,问题是在filterControl 发出它的第一个值(当我在input 中输入某些内容时)之前,不会显示任何过滤的项目。

有没有办法设置默认值,或者解决此类问题的更好方法?

【问题讨论】:

    标签: angular rxjs angular2-forms angular2-observables


    【解决方案1】:

    您可以使用startWith 运算符:

    this.filteredItems = this.filterControl.valueChanges.startWith('')
    

    这将确保第一个值(默认的空字符串)准备就绪

    【讨论】:

    • 谢谢!这很容易 :) 有很多新东西要学习,但要找到正确的信息并不容易。
    • 哦耶。 rxjs 是一个伟大的旅程。值得投资。你学得越多,你的代码就会变得越干净、可维护和高效
    猜你喜欢
    • 2021-08-19
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2015-10-13
    • 2017-03-13
    • 2021-10-25
    相关资源
    最近更新 更多