利用angular4和nodejs-express構建一個簡單的網站(九)—用戶登陸

最近工做比較忙,一直沒有更新文章。原來看別人的文章感受很過癮,如今本身寫才發現,要堅持下去真的很難。好了,廢話少說,繼續吧!
這一章主要講利用angularJs控制用戶登陸。在前面的用戶註冊表單中使用了angular的響應式表單。爲了對angular的知識學習的全面一點,在用戶登陸的表單中,使用了模板驅動型表單。css

先從html代碼開始

<div class="div-login">
  <form (ngSubmit)="onSubmit()" #loginForm="ngForm">
    <div class="form-group">
      <label for="name">User name</label>
      <input type="text" class="form-control" id="name" name="name" placeholder="Enter user name" [(ngModel)]="user.name" required
        #name="ngModel">
      <div *ngIf="name.invalid && (name.dirty || name.touched)"   class="alert alert-danger">
          User name is required!
      </div>
    </div>
    <div class="form-group">
      <label for="password">Password</label>
      <div class="input-group">
        <input class="form-control" id="password" name="passwrod" placeholder="Enter password" [(ngModel)]="user.password"
        required #password="ngModel">
      </div>
      <div *ngIf="password.invalid && (password.dirty || password.touched)" class="alert alert-danger">
          Password is required!
      </div>
    </div>
    <div class="form-group form-btn">
      <button type="submit" class="btn btn-primary" [disabled]="!loginForm.form.valid">Submit</button>
      <button type="button" class="btn btn-light" (click)="loginForm.reset()">Cancel</button>
    </div>
  </form>
</div>

在這個html文件的<form>標籤中,(ngSubmit)="onSubmit()"和用戶註冊表單同樣,用於處理表單的提交操做,爲了實如今表單不合法時提交按鈕的disabled爲false,須要讓按鈕可以訪問到表單,從而獲取到表單的狀態,因此,須要在<form>標籤中定義了一個模板引用變量 #loginForm,而且把賦值爲「ngForm」,同時在submit按鈕標籤中加入:[disabled]="!loginForm.form.valid"
兩個<input>標籤分別輸入用戶名和密碼,經過ngModel建立雙向綁定到組件類的User對象的name和password屬性,用於讀取和寫入輸入控件的值。這裏須要注意一點:當在表單中使用 [(ngModel)] 時,必需要定義 name 屬性
模板驅動表單的驗證都在html代碼中實現,須要完成如下幾項任務:html

  • 首先要定義模板引用變量,並賦值爲"ngModel",注意觀察<input>標籤中的 #name="ngModel"和#password="ngModel"。
  • 兩個用戶名和密碼的驗證規則比較簡單,只需required,在兩個<input>標籤中加入此屬性。
  • 顯示驗證錯誤信息和註冊表單差很少,當模板引用變量即兩個輸入框變爲dirty(控件值變化了)和touched(控件值被訪問過)狀態時,若是控件值無效(invalid),就顯示<div>標籤包裹的內容。

html部分的內容就這些了,下面咱們看一下控件類的內容。服務器

控件類

先把代碼放出來,後面慢慢分析。app

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent {
  user: User = new User(0, '', '', '');
  constructor(
    private route: Router,
    private jumService: JumbotronServive,
    private userServ: UserService,
  private tokenServ: AuthTokenService) {
    jumService.setJumbotron(new Jumbotron('Login',
      `Please login with your user name and password first`,
      ``));
  }
  onSubmit() {
    this.userServ.getUser(this.user).subscribe(
      (resp) => {
        this.tokenServ.setToken(resp.body['token']);
        this.route.navigate(['/birthday']);
        alert('登陸成功!');
      },
      (err)=>
      alert(this.userServ.handleError(err)),
      () => console.log('The Post observable is now completed. ')
    )
  }
}

控件類主要完成了以下功能:函數

  • 首先初始化了一個User類的對象,用於ngModel雙向綁定到控件。保證在html控件值變化時,綁定的User類的屬性同步變化。
  • 在構造函數中聲明瞭一個Router對象、一個JumbotronServive對象和UserService對象、AuthTokenService對象。並在構造函數中用JumbotronServive的setJumbotron方法更新了網頁的標題。(JumbotronServive的setJumbotron方法具體內容請看前面的文章。)
  • onSubmit()函數在表單提交時被觸發,在該函數中UserService的getUser()函數,getUser()函數向服務器發送了用戶名和密碼,若是服務器驗證成功,會發送回jwt認證信息的token字符串,其中包括了userid。在onSubmit()函數中調用AuthTokenService的setToken()函數,將這個字符串存儲到本地存儲,用於導航到下一個頁面(生日頁面)時驗證用戶信息。接下來導航到下一個頁面,並提示用戶登陸成功。若是發生錯誤,提示錯誤緣由。

用戶登陸主要的內容就這些了。其中還有一個小技巧性的東西就是在輸入密碼的時候,由於<input>標籤的type=password,顯示的輸入內容爲「.」,很容易輸錯。我在這個控件上放了一個能夠切換的圖片,用於讓用戶選擇是否查看明文。實現的方法主要是改變<input>控件的attr屬性。若是須要具體實現方法的朋友,能夠給我留言,我會在回覆中告訴你們。學習

相關文章
相關標籤/搜索