![](/img/trans.png)
[英]How can I load data from url promise before rendering html page in Ionic 2/3?
[英]How to load data before rendering page without using a resolver?
我的问题是在呈现页面之前未定义我的 object。 我想先加载我的数据,然后在不使用解析器或 ngIf 的情况下呈现页面。 我可以使用 LifeCycle Hooks 来完成这项工作吗?
我目前的设置:
app.component.ts
onNavigateToDetailView(url: string, title: string){
this.service.getResourceUrl(url).subscribe(
(data) => {
this.service.detailedObj = data;
console.log(data);
}
);
this.router.navigate(['detailedview/' + title]);
}
现在在我的view.component.ts
中,我想将我的服务中的 object 分配给一个变量:
ngOnInit(){
this.obj = this.service.obj;
}
在我view.component.html
我有:
{{obj.text}}
它现在可以工作了,因为正如我所说的 object 在渲染时是未定义的。 如果我像这样在我的服务中使用 object
{{this.service.obj.text}
它有效,但我不想使用它。
那么我可以以某种方式等待数据被定义,然后在不使用解析器或 *ngIf 的情况下呈现页面吗? 是否可以使用另一个 LyfeCycle Hook 而不是 ngOnInit?
Stackblitz: https://stackblitz.com/edit/angular-21zvgm
正如您在导航到 hello.component 并清空 object 后看到的那样,是控制台的 output。 但是当您单击 hello.component 中的显示时。 object 已正确初始化...
您可以使用异步 pipe:
在您的 ts 文件中:
data$: Observable<any>;
ngOnInit() {
this.data$ = this.service.getResourceUrl(url);
}
在 html 中:
{{(data$ | async)?.text}}
在检查了你的堆栈闪电战和问题后,我明白了,你需要一个守卫在路上。
我首先修改了您的 getInfo 服务以返回Promise
getInfo(titel: string, type: string) {
return this.http.get(...).toPromise()
.then( data => {this.obj = data; return data; });
}
我创建了一个警卫服务并实现CanActivate
@Injectable({
providedIn: "root"
})
export class AppGuardService implements CanActivate {
constructor(private router: Router, private srv: MyserviceService) {}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.srv.getInfo("The Beatles", "artist")
.then(() => return true; })
.catch(error => {
console.error(error);
return false;
});
}
}
修改路由以实现canActivate :
{ path: "hello", component: HelloComponent, canActivate:[AppGuardService] }
你可以在https://stackblitz.com/edit/angular-nazeby 看到整个 stackblitz
更新:
但是,如果用例只需要一个导航,您可以修改navigate
function,它现在作为 Promise 从服务获取数据,并且可以跳过 app-guard 服务和 CanActivate
navigate(){
this.srv.getInfo("The Beatles", "artist").then(
() => this.router.navigate(["/hello"])
)
}
快乐编码!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.