Angular 角度-先执行一个方法再执行另一个方法
我有两种方法,一种是推送值,另一种是补丁值,我需要最终确定推送值,这样补丁值方法才能正常工作。我在一个ngAfterViewInit中调用了这两个函数,我想知道一种不在push-value方法中调用patch-value方法的方法 这两种方法都在这里调用Angular 角度-先执行一个方法再执行另一个方法,angular,typescript,Angular,Typescript,我有两种方法,一种是推送值,另一种是补丁值,我需要最终确定推送值,这样补丁值方法才能正常工作。我在一个ngAfterViewInit中调用了这两个函数,我想知道一种不在push-value方法中调用patch-value方法的方法 这两种方法都在这里调用 ngAfterViewInit(): void { this.inicializarListaGrupoAnaliseCae(); this.iniciarDadosVisualizar(); /
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请求,它应该在数据加载后完成,这样就不会有问题,但是如果是其他问题,您可能需要了解如何取消订阅