angular2父子组件通讯 异步问题

查看:102
本文介绍了angular2父子组件通讯 异步问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

angular2父子组件通讯,可以通过:在父组件的模板中绑定变量,在子组件的属性用 @Input 进行修饰。
现在遇到的问题是:一般变量,可以通过这种方式来通讯,但遇到需要加载其他资源,比如ajax这种异步加装变量的方式,就会导致错误。
父组件:

//html
<div class="modifymember-wrap">
  <addmember [adminData]="admin"></addmember>
</div>
//ts
this.managerService.selectedAdmin.subscribe(data => {
      this.admin = data;
      });

managerService为一个服务,里面的selectedAdmin方法是get(),异步操作。
子组件:

@Input() adminData;
ngOnInit() {
    let admin = adminData;
    console.log('admin');
}
ngAfterViewInit() {
    let admin = adminData;
    console.log('admin');
}

因为是异步操作,当加载网页的时候,子组件会先于父组件加载,导致子组件里的变量admin在没有获取到父组件传递的值之前就已经执行了,导致错误。
这样的问题,需要如何处理?

解决方案

manager.service.ts

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';

@Injectable()
export class ManagerService {

    constructor(public http: Http) { }

    getPerson(): Observable<{ id: number; title: string; body: string }>{
        return this.http.get('https://jsonplaceholder.typicode.com/posts/1')
        .map(res => res.json());
    }
}

add-member.component.ts

import {Component, Input, OnChanges, SimpleChanges} from '@angular/core';

@Component({
    selector: 'add-member',
    template: `
        <p>id:{{ adminData?.id}}</p>
    `
})
export class AddMemberComponent implements OnChanges{
 @Input() adminData: { id: number; title: string; body: string };

 ngOnChanges(changes: SimpleChanges) {
   if(changes['adminData'] && changes['adminData'].currentValue) {
     console.dir(changes['adminData'].currentValue);
   }
 }
}

app.component.ts

import { Component, OnInit } from '@angular/core';
import {ManagerService} from "./manager.service";

@Component({
  selector: 'exe-app',
  template: `
   <add-member [adminData]="admin"></add-member>
  `
})
export class AppComponent implements OnInit {
  admin: { id: number; title: string; body: string };

  constructor(private managerService: ManagerService) { }

  ngOnInit() {
    this.managerService.getPerson().subscribe(
      res => this.admin = res
    );
  }
}

可以先看一下这篇文章 Angular 2 AsyncPipe,也可以使用AsyncPipe,但文中提到的问题,要注意一下哈。另外组件生命周期中各个钩子的作用及执行顺序也要去了解一下。

这篇关于angular2父子组件通讯 异步问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆