【问题标题】:Emit search input value to child components in Angular 2向Angular 2中的子组件发出搜索输入值
【发布时间】:2018-03-11 08:58:41
【问题描述】:

在 Angular 2 应用程序中,我有一个 HTML 搜索输入,我想将其值发送给 3 个子组件,前提是用户停止输入 300 毫秒并且他输入的内容与输入所包含的内容不同。我在网上看了一些文章,都提到了SubjectdebounceTimedistinctUntilChanged运算符的使用。按照其中一个教程,我最终得到了以下代码:

父组件:

// Subject to emit an observable
public searchUpdated: Subject <string> = new Subject<string>();

@Output() searchChangeEmitter: EventEmitter <any> = new EventEmitter <any>();

constructor() {
  [.......]
  this.searchChangeEmitter = <any>this.searchUpdated.asObservable()
    .debounceTime(300)
    .distinctUntilChanged(); // accept only relevant chars
}

onSearchType(value : string) {
  this.searchUpdated.next(value); // Emit the changed value to the subscribers
}

父模板:

<input class="input-group-field" type="search" id="inputSearch" name="inputSearch" (keyup)="onSearchType($event.target.value)">

我想将发出的值传递给子组件,但我感觉有点失落。我试过了,但没有用:

父模板

<app-object-tree [searchFilter]="searchChangeEmitter"></app-object-tree>

(并且,在子组件 'app-object-tree' 中,创建 @Input 'searchFilter' 并订阅它以尝试获取值。)

创建一个服务,在父组件中提供它并在子组件上订阅它对我来说更有意义,但是我不知道在应用“debounceTime”后如何调用服务“setter”函数和“distinctUntilChanged”操作。

非常感谢,如果我没有正确解释自己,我很抱歉,我仍在努力将所有主题/可观察的概念联系起来。

【问题讨论】:

    标签: javascript angular rxjs angular2-observables


    【解决方案1】:

    为什么你需要一个 observable 或 EventEmitter 呢?我认为不可能向孩子发出事件。但是你可以简单地传递一个变量。在父控制器中:

    searchValue: string;
    private _searchSubject: Subject<string> = new Subject();
    
    constructor() {
      [.......]
      this._searchSubject
        .debounceTime(200)
        .distinctUntilChanged()
        .subscribe(result => {
          this.searchValue = result;
        });
    }
    
    onSearchType(value : string) {
      this._searchSubject.next(value);
    }
    

    在父模板中:

    <input class="input-group-field" type="search" id="inputSearch" name="inputSearch" (keyup)="onSearchType($event.target.value)">
    <app-object-tree [searchFilter]="searchValue"></app-object-tree>
    

    现在,每次父项中的 searchValue 更改时,子项的 @Input 值 (searchFilter) 都会更新。无需在儿童身上观察任何东西,它会不断更新。

    【讨论】:

    • 你完全正确,在这种情况下不需要 EventEmitter。我实施了您的解决方案,并且效果很好。在子组件中,我创建了一个 @Input 属性设置器,每次用户键入任何搜索词时,它都会传递给子组件。谢谢!
    猜你喜欢
    • 2018-06-18
    • 2016-07-16
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多