【问题标题】:How to make Angular2 wait for a promise before rendering component如何让Angular2在渲染组件之前等待一个promise
【发布时间】:2017-01-14 11:47:11
【问题描述】:

首先:是的,我事先在 Google 上搜索过,然后出现的 solution 对我不起作用。

背景

我有一个调用服务的 Angular 2 组件,并且在收到响应后需要执行一些数据操作:

ngOnInit () {
  myService.getData()
    .then((data) => {
      this.myData = /* manipulate data */ ;
    })
    .catch(console.error);
}

在其模板中,该数据被传递给子组件:

<child-component [myData]="myData"></child-component>

这会导致孩子将myData 视为未定义的错误。上面发布的 Google 结果谈到了使用Resolver,但这对我不起作用。

当我创建一个新的解析器时:

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Rx';
import { MyService } from './my.service';

@Injectable()
export class MyResolver implements Resolve<any> {
    constructor(private myService: MyService) {}

    resolve (route: ActivatedRouteSnapshot): Observable<any> {
        return Observable.from(this.myService.getData());
    }
}

app.routing.ts

const appRoutes: Routes = [
  {
    path: 'my-component',
    component: MyComponent,
    resolve: {
        myData: MyDataResolver
    }
  }
];

export const routing = RouterModule.forRoot(appRoutes);

我收到一条错误消息,指出没有MyDataResolver 的提供程序。当我将MyDataResolver 添加到app.component.ts 中的providers 属性时,情况仍然如此:

@Component({
  selector: 'my-app',
  templateUrl: 'app/app.component.html',
  providers: [
        MyService,
        MyResolver
  ]
})

使用这个的界面变了吗?

【问题讨论】:

  • 你能实现“myData”子属性作为设置器并在那里检查“未定义”吗?
  • MyResolver 还是MyDataResolver。您问题中的代码似乎不一致。

标签: angular resolver


【解决方案1】:

路由器支持从resolve()返回的promise或observable。
另见https://angular.io/api/router/Resolve

这应该做你想做的:

@Injectable()
export class MyResolver implements Resolve<any> {
    constructor(private myService: MyService) {}

    resolve (route: ActivatedRouteSnapshot): Promise<any> {
        return this.myService.getData();
    }
}

另见https://angular.io/docs/ts/latest/guide/router.html#!#resolve-guard

【讨论】:

  • 基于第二个链接,我在 app.module.ts 中将MyResolver 添加到providers,但child-component 仍然出错,因为它正在获取数据未定义。似乎它仍在父组件拥有数据之前被实例化。这可能是因为父组件正在等待解析器,而不是子组件?但是子组件没有与之关联的路由,而父组件是获取数据的组件,所以我不确定如何让它等待。
  • 很难从这个描述中看出你的代码到底在做什么。最简单的方法是添加一个*ngIf,比如&lt;child-component *ngIf="data" [myData]="myData"&gt;&lt;/child-component&gt;
  • 我的错误。我仍然试图通过父组件的构造函数中的 REST 调用来提取它,而不是从路由数据中提取它。我的脑袋,对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2020-10-01
  • 2023-04-01
  • 2022-12-03
  • 2017-05-22
相关资源
最近更新 更多