【问题标题】:Angular 2 get data before loading child componentsAngular 2 在加载子组件之前获取数据
【发布时间】:2017-05-13 13:46:36
【问题描述】:

我想在应用程序的主根组件中获取用户数据,然后在将用户数据存储到服务中后继续加载其他组件。我怎样才能做到这一点?目前,我有这样的事情:

@Injectable()
export class UserService {

user: Subject<User> = new BehaviorSubject(new User());

constructor(private _httpService: HTTPService){}

getUser(){
    return this.user;
}

getUserFromAPI(){
    this._httpService.get('user')
        .map(data => data.json())
        .subscribe(data => {
            this.user.next(data);
        });
}

但是通过这种方式,这意味着我需要通过我不想要的 Observable 让用户在所有其他地方。我想要一个静态访问。 目前,我正在获取用户:

this._userService.getUser().subscribe(data => {
        this.user = data;
    });

【问题讨论】:

  • “静态访问”是什么意思?
  • 我的意思是我可以像this.user = _userService.getUser();这样在组件中获取用户数据
  • 如果您使用异步调用获取数据,那是不可靠的。
  • 是的,但请阅读问题。我想让用户加载暂停加载子组件,直到用户被存储到服务中。
  • 这就是我下面的回答。

标签: angular


【解决方案1】:

您可以使用 APP_INITIALIZER Angularjs2 - preload server configuration before the application starts 让 Angular 在数据可用之前等待渲染任何组件

或者您可以使用*ngIf 来防止组件在数据可用之前被渲染

<ng-container *ngIf="data">
  <child1></child1>
  <child2></child2>
</ng-container>

【讨论】:

  • 使用 *ngIf 我收到错误找不到加载 SomeComponent 的主要出口。你知道我该如何解决这个问题吗?
  • 如果组件是由路由器添加的,请使用解析器angular.io/docs/ts/latest/guide/router.html#!#resolve-guard
  • 如果我错了,请纠正我,但据我所知,根组件不是通过路由器加载的?
  • 对,路由器没有添加根组件,但问题是在数据可用之前没有添加子组件。如果您的子组件是由路由器添加的,那么您应该使用resolve 来延迟添加组件,直到数据可用。
  • 但这不是在一个地方处理的。这不是我所要求的解决方案。这意味着我需要遍历每条新路线并添加解决方案。
猜你喜欢
  • 2017-01-02
  • 2020-11-16
  • 2019-02-03
  • 2017-12-09
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多