在oninit之前的angular2渲染组件

时间:2016-12-24 02:00:48

标签: angular angular2-routing page-refresh

我有以下代码段

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内做同样的事情(如果不存在则通过http调用获取用户)。问题是我在完成userComponent的init方法之前首先在页面刷新上渲染我的UserComponent它将导航到AppComponent init方法,之后user.component.html将崩溃而没有用户数据说Cannot read property 'name' of undefined。并且它将再次重定向到UserComponent的onInit,但此时用户html已经渲染并进行了翻译。

如何修复此方案,是否有最好的方法来处理这种情况?

提前致谢..

2 个答案:

答案 0 :(得分:4)

您可以将<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>

还有一种方法可以在您的路线中使用“解决方案”,这样只有完成您的决定后才会启动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

的信息

答案 1 :(得分:2)

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