javascript - 向 Angular 2 中的子组件发送搜索输入值

标签 javascript angular rxjs angular2-observables

在 Angular 2 应用程序中,我有一个 HTML 搜索输入,我想将其值发送到 3 个子组件,前提是用户停止输入 300 毫秒并且他输入的内容与输入包含的内容不同。我在 Internet 上阅读了一些文章,它们都提到了 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”操作。

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

最佳答案

为什么为此需要一个 observable 或 EventEmitter?我认为不可能向 child 发出事件。但是您可以简单地传递一个变量。在父 Controller 中:

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>

子项的@Input 值(searchFilter)现在将在每次父项中的searchValue 更改时更新。不需要观察 child 的任何东西,它会得到更新。

关于javascript - 向 Angular 2 中的子组件发送搜索输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489081/

相关文章:

javascript - angular ActivatedRoute.queryParams 不允许 rxjs 运算符?

javascript - 无法获得正确的js正则表达式

javascript - 使用 javascript 删除不需要的空格

css - 如何使用 CSS 更改 Angular2 中任何 PrimeNG 模块的颜色?

rxjs - BehaviorSubject 初始值不适用于 share()

javascript - 如何从一个组件发布事件并从nativescript中的另一个组件接收事件

javascript - 为什么我的两个 javascript 代码没有运行?

javascript - Wordpress 插件功能在桌面上运行良好但在移动设备上运行不正常。为什么?

Angular2路由器,从url获取路由数据,显示面包屑

angular - 除非提供 '--module' 标志,否则无法编译外部模块