Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用RxJS等待组件不为null_Javascript_Angular_Rxjs - Fatal编程技术网

Javascript 使用RxJS等待组件不为null

Javascript 使用RxJS等待组件不为null,javascript,angular,rxjs,Javascript,Angular,Rxjs,我在html模板上使用的组件具有相当复杂的*ngIf条件 <my-component #myComponent *ngIf="..."></my-component> 在“点击”按钮后,我发送请求,显示/隐藏一些东西。。。在ma页面上-之后,我的组件中的*ngIf应该设置为true。当this.myComponent不为null时,我可以调用其中的initdata函数。当这个组件不为null时,我尝试使用rxjs进行等待。setTimeout方法有时

我在html模板上使用的组件具有相当复杂的*ngIf条件

<my-component #myComponent *ngIf="..."></my-component>
在“点击”按钮后,我发送请求,显示/隐藏一些东西。。。在ma页面上-之后,我的组件中的*ngIf应该设置为true。当this.myComponent不为null时,我可以调用其中的initdata函数。当这个组件不为null时,我尝试使用rxjs进行等待。setTimeout方法有时会失败,如下所示

让检查=真; 让data=wait this.loadData; interval100.pipetakeWhile=>checking.subscribe{ ifthis.myComponent{ this.myComponent.initdata 检查=假; } } // ... 使this.myComponent不为空的东西 但是这段代码并不好——它每100ms检查一次变量值,代码也相当长和复杂。是否有更智能的解决方案,例如,只有当this.myComponent将值从null更改而不每隔100ms ping一次时,才会触发代码

使现代化 我忘了提到以上间隔。。。代码在某个异步回调中,因此实际上我需要等待数据准备就绪且myComponent不为空时我也会更新上面的代码

您应该将调用this.myComponent.initdata移动到myComponent中的ngOnInit中。使用@Input变量用数据初始化组件

<my-component #myComponent *ngIf="..." [data]="data"></my-component>
ngOnInit保证每个组件生命周期调用一次。每次切换布尔表达式时,ngIf都会销毁/创建组件。

您应该将调用this.myComponent.initdata移动到myComponent中的ngOnInit中。使用@Input变量用数据初始化组件

<my-component #myComponent *ngIf="..." [data]="data"></my-component>

ngOnInit保证每个组件生命周期调用一次。每次切换布尔表达式时,ngIf都会销毁/创建该组件。

您可以在子组件上使用EventEmitter并侦听该组件:

在您在ngOnInit函数中发送的子组件上,或在您准备就绪时:

@Output() loaded = new EventEmitter<void>();
在父组件HTML中:

<my-component #myComponent *ngIf="..." (loaded)="myComponent.init(data)"></my-component>

您可以在子组件上使用EventEmitter并侦听:

在您在ngOnInit函数中发送的子组件上,或在您准备就绪时:

@Output() loaded = new EventEmitter<void>();
在父组件HTML中:

<my-component #myComponent *ngIf="..." (loaded)="myComponent.init(data)"></my-component>

@胡安:不,这是不同的,我认为你是在为ViewChild寻找塞特。您无需使用interval来监视零部件引用是否已定义。你应该参考-@Juan no-这是不同的,我想你是在寻找ViewChild的setter。您无需使用interval来监视零部件引用是否已定义。您应该参考-这是一个非常聪明的方法:-但是数据在嵌套的异步代码中-所以实际上我也必须等待它我更新问题-但是我给出+1-谢谢这是一个非常聪明的方法:-但是数据在嵌套的异步代码中-所以实际上我也必须等待它我更新问题-但是我给出+1-谢谢,这是一种非常聪明的方法——不过在我的组件上,我使用ngOnInit{loaded.emit}——在父html load=initMyComponent和in.ts initMyComponent{this.myComponent.initthis.data}——但是数据在嵌套的异步代码中——所以实际上我也必须等待它。但是我给出+1-谢谢你这是一个非常聪明的方法-但是在我的组件上我做了ngOnInit{loaded.emit}-在父html load=initMyComponent和in.ts initMyComponent{this.myComponent.initthis.data}-但是数据在嵌套的异步代码中-所以实际上我也必须等待它。但是我给+1-谢谢