如何随时获取父组件中的子组件输入元素

Posted

技术标签:

【中文标题】如何随时获取父组件中的子组件输入元素【英文标题】:How to get child component input element in parent at any time 【发布时间】:2018-08-13 13:55:49 【问题描述】:

我正在使用父子组件。在子组件中,我使用搜索框。我需要随时按需获取搜索框值。这个怎么弄?

子组件 html - GridViewComponent

<input id="successFilter" name='filterInput' type="text" (keyup)="searchSuccess($event)">

父组件 ts

@ViewChild(GridviewComponent) grdView: GridviewComponent;

在构造函数之前写上一行

this.grdView.filterInput.subscribe(data => 
  console.log(data);
);

无法获取输入值

【问题讨论】:

发布您的代码,向我们展示您的尝试。 Parent 将输入传递给 Child 组件Child 将输出事件发送给 Parent,我希望你的意思是这样的 【参考方案1】:

您的解决方案的版本之一如下(组件 A - 父组件,组件 B - 子组件):

在组件 B 中: 在 html 文件中:

<input ... [(ngModel)]="inputValue" ...>

在componentB.ts文件中:

@Input() needAnswer : ReplaySubject<any>(1);
@Output() hereYourAnswer = new EventEmmiter<any>();
inputValue: string;
private subscription: Subscription;


...

ngOnInit() 
  this.subscription = this.needAnswer.subscribe( giveMeAnswer => this.hereYourAnswer.emit(this.inputValue));


...
ngOnDestroy() 
  this.subscription.unsubscribe();

在组件A中,html:

<component-b [needAnswer]='needAnswer' (hereYourAnswer)='getAnswer(event$)'></component-b>

在componentA.ts文件中:

...
needAnswer = new ReplaySubject<any>(1);

...
getInputDataFromComponentB() 
  this.needAnswer.next('give me answer!!! please)');

...

getAnswer(answer) 
  console.log(answer, 'here i am');


...

使用 RXJS 很简单。

【讨论】:

我知道你已经添加了...,但是你应该提到在onDestroy生命周期钩子中取消订阅needAnswer-Subject 的部分,否则,OP 可以轻松地为自己构建一个内存泄漏。 我为你修正了一个小错误,你不小心使用了类型作为值,也只是使用Subscription作为类型而不是ISubscription

以上是关于如何随时获取父组件中的子组件输入元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将初始表单值传递给 Vue.js 中的子组件?

如何从 blazor 中的子组件获取属性

Vue父组件如何调用子组件(弹出框)中的方法的问题

如何将道具传递给vue中的子组件

从Angular 2中的子组件更新父组件属性

在 React 中访问父组件中的子状态值