Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Angular 角度-先执行一个方法再执行另一个方法_Angular_Typescript - Fatal编程技术网

Angular 角度-先执行一个方法再执行另一个方法

Angular 角度-先执行一个方法再执行另一个方法,angular,typescript,Angular,Typescript,我有两种方法,一种是推送值,另一种是补丁值,我需要最终确定推送值,这样补丁值方法才能正常工作。我在一个ngAfterViewInit中调用了这两个函数,我想知道一种不在push-value方法中调用patch-value方法的方法 这两种方法都在这里调用 ngAfterViewInit(): void { this.inicializarListaGrupoAnaliseCae(); this.iniciarDadosVisualizar(); /

我有两种方法,一种是推送值,另一种是补丁值,我需要最终确定推送值,这样补丁值方法才能正常工作。我在一个ngAfterViewInit中调用了这两个函数,我想知道一种不在push-value方法中调用patch-value方法的方法

这两种方法都在这里调用

ngAfterViewInit(): void {
        this.inicializarListaGrupoAnaliseCae();
        this.iniciarDadosVisualizar();
        //this.iniciarSituacaoCadastro();
        this.cdr.detectChanges();
    }
PatchValue方法:

iniciarDadosVisualizar() {
        if(this.isVisualizando || this.isEdit){
            this.dadosVisualizar.grupoAnaliseCae.noGrupoAnaliseCae='CONSELHO';
            this.formPesquisar.controls['descricaoMotivo'].patchValue(this.dadosVisualizar.descricaoMotivo);
            this.formPesquisar.controls['grupoAnaliseCae'].patchValue(this.dadosVisualizar.grupoAnaliseCae);
            this.formPesquisar.controls['categoriaMembro'].patchValue(this.dadosVisualizar.grupoAnaliseCae);
            this.formPesquisar.controls['situacaoMotivo'].patchValue(this.dadosVisualizar.situacaoMotivo);
        }
        if(this.isVisualizando){
            this.desabilitarCampos()
        }
    };
private inicializarListaGrupoAnaliseCae(): void {
        this.grupoAnaliseCaeService
            .findAll()
            .subscribe(res => {
                res.forEach((grupoAnaliseCae: GrupoAnaliseCae) => {
                    if(grupoAnaliseCae.nuNivelGrupo==null){
                    this.listaGrupoAnaliseCae.push({ label: grupoAnaliseCae.noGrupoAnaliseCae, value: grupoAnaliseCae });
                    this.formataNomeGrupo();
                    }
                });
            });
    }
推值法:

iniciarDadosVisualizar() {
        if(this.isVisualizando || this.isEdit){
            this.dadosVisualizar.grupoAnaliseCae.noGrupoAnaliseCae='CONSELHO';
            this.formPesquisar.controls['descricaoMotivo'].patchValue(this.dadosVisualizar.descricaoMotivo);
            this.formPesquisar.controls['grupoAnaliseCae'].patchValue(this.dadosVisualizar.grupoAnaliseCae);
            this.formPesquisar.controls['categoriaMembro'].patchValue(this.dadosVisualizar.grupoAnaliseCae);
            this.formPesquisar.controls['situacaoMotivo'].patchValue(this.dadosVisualizar.situacaoMotivo);
        }
        if(this.isVisualizando){
            this.desabilitarCampos()
        }
    };
private inicializarListaGrupoAnaliseCae(): void {
        this.grupoAnaliseCaeService
            .findAll()
            .subscribe(res => {
                res.forEach((grupoAnaliseCae: GrupoAnaliseCae) => {
                    if(grupoAnaliseCae.nuNivelGrupo==null){
                    this.listaGrupoAnaliseCae.push({ label: grupoAnaliseCae.noGrupoAnaliseCae, value: grupoAnaliseCae });
                    this.formataNomeGrupo();
                    }
                });
            });
    }

尝试将可观察的转换为承诺,如下所示:

private async inicializarListaGrupoAnaliseCae(): Promise<any> {
        return this.grupoAnaliseCaeService
            .findAll()
            .toPromise().then(res => {
                res.forEach((grupoAnaliseCae: GrupoAnaliseCae) => {
                    if(grupoAnaliseCae.nuNivelGrupo==null){
                    this.listaGrupoAnaliseCae.push({ label: grupoAnaliseCae.noGrupoAnaliseCae, value: grupoAnaliseCae });
                    this.formataNomeGrupo();
                    }
                });
            });
    }

是StackBlitz的一个例子。

一旦在程序中引入了单点反应范式(此处的订阅),所有相关的后续语句也应该是反应式的。在您的场景中,最快的修复方法是在订阅中调用依赖函数

ngAfterViewInit():void{
这是一种特殊的疾病;
this.cdr.detectChanges();
}
private Inicializarlistagrupoanalisece():void{
此.grupoAnaliseCaeService
.findAll()
.订阅(res=>{
res.forEach((Grupoanalisece:Grupoanalisece)=>{
if(grupoAnaliseCae.nuNivelGrupo==null){
这是我的({
标签:Grupoanalisece.nogruponalisece,
价值:Grupoanalisece
});
这个。formataNomeGrupo();
}
});

this.inicializarlistagrupoanalisece();//我假设您的初始值(pushValues)来自HTTP服务,可能需要一些时间才能解决。您实际上是在此处查找状态,这意味着您需要在修补之前了解表单的状态。如果是这种情况,则可以使用
行为子对象
或仅使用普通变量跟踪状态,以确定表单是否准备修补

private isFormInitialized = false;
在可观察的初始值设定项中:

private inicializarListaGrupoAnaliseCae(): void {
    this.grupoAnaliseCaeService
        .findAll()
        .subscribe(res => {
            res.forEach((grupoAnaliseCae: GrupoAnaliseCae) => {
                if(grupoAnaliseCae.nuNivelGrupo==null){
                this.listaGrupoAnaliseCae.push({ label: grupoAnaliseCae.noGrupoAnaliseCae, value: grupoAnaliseCae });
                this.formataNomeGrupo();
                }
            });

            // update form state tracker
            this.isFormInitialized = true;
        });
}
现在,在修补之前使用状态进行检查:

iniciarDadosVisualizar() {
    if(this.isFormInitialized && this.isVisualizando || this.isEdit){
    ... // other logic
};

第一个方法是异步的,不返回任何问题所在。您不应该在该方法中订阅,而应该返回可观察的。然后在
ngAfterViewInit
中,您可以订阅该方法,并在完成后调用第二个方法

我不确定您是否需要为另一个返回您的Observable中的任何内容,因此
Observable
或其他返回可能更合适

新的推送方法

private-inicializarlistagrupoanalisece():可观察{
返回此.grupoAnaliseCaeService
.findAll()
.烟斗(
轻触(res=>{
res.forEach((Grupoanalisece:Grupoanalisece)=>{
if(grupoAnaliseCae.nuNivelGrupo==null){
this.listaGrupoAnaliseCae.push({标签:grupoAnaliseCae.noGrupoAnaliseCae,值:grupoAnaliseCae});
这个。formataNomeGrupo();
}
});
})
);
}
新ngAfterViewInit

ngAfterViewInit():void{
this.inicializarlistagrupoanalisece().subscribe(()=>{
这个;
//这个.iniciarsiuacaocadastro();
this.cdr.detectChanges();
});
}
注意,我不是在这里管理订阅。如果您的findAll()方法是HTTP请求,它应该在数据加载后完成,这样就不会有问题,但是如果是其他问题,您可能需要了解如何取消订阅