typescript 如何将订阅中的对象传递给Angular中的实际变量?

jhkqcmku  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(128)

我尝试将从订阅中获得的数据传递到一个局部变量中,但每次i console.log(the local object)时它都返回undefined,但当I console.log(data from the subscription)时数据正确返回。我需要局部变量中的对象来访问html模板中的参数。
我在一个角服务中有这个方法

export class MachinesService {

apiURL: string = environment.apiURL + 'Machine/';

constructor(private http: HttpClient) { }

public getMachine(id: number): Observable<IMachine> {return this.http.get<IMachine>(this.apiURL + ${id})}}

在应用程序组件中,我从路由器快照接收id,并使用该id调用服务方法,我尝试了不同的方法。
首先是这个:

export class MachineViewComponent implements OnInit { 
redirect: string | null = null;

machine?: IMachine ; 
machineId? : number;

constructor(
    private route: ActivatedRoute,
    private machinesService : MachinesService,
    private router : Router ) { } 

ngOnInit(): void {
 this.machineId = parseInt( this.route.snapshot.paramMap.get("id")!); this.machinesService.getMachine(this.machineId!).subscribe(data => { this.machine = data; })
 }

}

然后是:

export class MachineViewComponent implements OnInit {
    redirect: string | null = null;

 subscription: Subscription[] = [];
 machine?: IMachine ;
 machineId? : number;

    constructor(
        private route: ActivatedRoute ,
        private machinesService : MachinesService, 
        private router : Router ) { }

    ngOnInit(): void { 
        this.machineId = parseInt( this.route.snapshot.paramMap.get("id")!);
        this.RefreshData(); 
    }

    RefreshData() {
    this.subscription.push(this.machinesService.getMachine(this.machineId!).subscribe(data =>{
    this.machine = data;
       })) 
    };

}

也是这样:

export class MachineViewComponent implements OnInit { 
    redirect: string | null = null;
    
    machine?: IMachine ; 
    machineId? : number;

    constructor(
    private route: ActivatedRoute , 
    private machinesService : MachinesService, 
    private router : Router ) { }

    ngOnInit(): void { 
    this.machineId = parseInt( this.route.snapshot.paramMap.get("id")!);
    let GetMachineAsync = async (machineId : number): Promise<any> =>{
        const machinex  = await
        this.machinesService.getMachine(this.machineId!).subscribe(machine => {
            return machine});
        return machinex
    }; 
    GetMachineAsync(this.machineId).then(x => {console.log(x); this.machine = x}) } }

然后我就没办法了
每次我记录这个。机器是未定义的,但来自订阅的机器元素是正确的。
同样,当我在网络中查找http响应时,对象也在这里。
我做错了什么?

pftdvrlh

pftdvrlh1#

虽然最初的问题可能是由名称中的拼写错误引起的,但代码仍然存在细微的缺陷。例如,如果您限制网络连接,并强制HTTP请求花费更长时间,您的代码可能会失败。此处的代码仅在HTTP请求发生得太快以至于模板还没有机会呈现时才有效。
我会将machine设为Observable,然后在模板中使用异步管道订阅它:

ngOnInit() {
    this.machine = this.machinesService.getMachine(this.machineId!);
}

// In the template:
{{ (machine | async).machineName }}

现在,machine在被提取之前是无法访问的。

相关问题