繁体   English   中英

oninit之前的angular2渲染组件

[英]angular2 render component before oninit

我有以下代码片段

import { Component, OnInit } from "@angular/core";
import { AuthenticationService } from "../shared/services/authentication.service";
import { User } from "./user";
import { UserService } from "./user.service";

@Component({
    templateUrl:'./user.component.html'
})
export class UserComponent implements OnInit{
    user: User;

    constructor(
        private _userService: UserService,
        private _authService:AuthenticationService){
    }

    ngOnInit(){

        let user = this._userService.getUser();

        if(!user){
            this._authService.getLoggedUser().subscribe(
                user => {
                    this.user = user;
                    this._userService.setLoggedUser(user);
                }
            );

            this._userService._loggedUser$.subscribe(
                user => {
                    this.user = user;
                }
            )
        }else{
            this.user = user;
        }
    }
}

这与使用else块进行第一个路由初始化(/ user / profile)的效果很好。但是当用户刷新浏览器窗口时,我再次向服务器发出了一个请求,并让用户返回并渲染了我的html组件( if(!user)块)。这是HTML视图

<form>
        <fieldset>
            <legend>Profile</legend>
            <div class="form-group">
                <label>Name</label>
                <input name="name" type="text" class="form-control" [(ngModel)]="user.name">
            </div>
            <div class="form-group">
                <label>Mobile</label>
                <input name="mobile" type="text" class="form-control" [(ngModel)]="user.mobileNumber">
            </div>
            <div class="form-group">
                <label>Password</label>
                <input name="password" type="password" class="form-control">
            </div>
            <div class="form-group">
                <label>Email</label>
                <input name="email" type="text" class="form-control" [(ngModel)]="user.email" disabled>
            </div>
        </fieldset>
    </form>

我有AppComponent,它将在onInit内执行相同的onInit (如果不存在,则通过http调用获取用户)。问题是当我在完成userComponent的init方法之前首先刷新页面上的UserComponent时将导航到AppComponent的init方法并在该user.component.html崩溃之后,没有用户数据说Cannot read property 'name' of undefined并且它将再次重定向到UserComponent的onInit,但此时用户html已经呈现并消失。

我该如何解决这种情况?有没有最好的方法来处理这种情况?

提前致谢..

您可以将<form>放在<div *ngIf="user">..</div>并且仅当用户内部具有一些值时,此组件才会加载。 因此您不会收到该错误。

<div *ngIf="user">
     <form> <fieldset>
            <legend>Profile</legend>
            <div class="form-group">
                <label>Name</label>
                <input name="name" type="text" class="form-control" [(ngModel)]="user.name">
            </div>
           .............
           .............
    </form>
</div>

还有另一种方法可以在路由中使用resolve,因此只有完成解析后,才会启动user.component。

export const AppRoutes: Routes = [
  ...
  { 
    path: 'contact/:id',
    component: ContactsDetailComponent,
    resolve: {
      contact: 'contact'
    }
  }
];

从此处阅读有关解决问题的信息http://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html

那这个呢? 用户进入后显示表单。 <fieldset *ngIf="user">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM