下面我们来研究一下Angular4.0模板驱动的表单,效果如下:

一、创建 表单Hero 模型类

src/app/hero.ts  //文件路径
export class Hero {
  constructor(
    public id: number,
    public name: string,
    public power: string,
    public alterEgo?: string
  ) {  }
}

二、创建 表单控制器

1.创建 组件

src/app/hero-form.component.ts //文件路径
import { Component } from '@angular/core';

import { Hero }    from './hero';

@Component({
  selector: 'hero-form',
  templateUrl: './hero-form.component.html'
})
export class HeroFormComponent {

  powers = ['Really Smart', 'Super Flexible',
            'Super Hot', 'Weather Changer'];

  model = new Hero(18, 'Dr IQ', this.powers[0], 'Chuck Overstreet');

  submitted = false;

  onSubmit() { this.submitted = true; }

  // TODO: Remove this when we're done
  get diagnostic() { return JSON.stringify(this.model); }
  newHero() { this.model = new Hero(42, '', '');}
 
}

2.导入 组件

src/app/app.module.ts  //文件路径
import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';
import { AppComponent }  from './app.component';
import { HeroFormComponent } from './hero-form.component';
@NgModule({
  imports: [
    BrowserModule,
    FormsModule
  ],
  declarations: [
    AppComponent,
    HeroFormComponent
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

3.修改 app.component.ts根组件

src/app/app.component.ts  //文件路径
import { Component } from '@angular/core';
@Component({
  selector: 'my-app',
  template: ''
})
export class AppComponent { }

三、创建视图,初始 HTML 表单模板

src/app/hero-form.component.html  //文件路径
<link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">     
<style>
//定义css
.ng-valid[required], .ng-valid.required  {
 border-left: 5px solid #42A948; /* green */
}
.ng-invalid:not(form)  {
 border-left: 5px solid #a94442; /* red */
}

</style>


<div class="container">
 <div [hidden]="submitted">
   <h1>Hero Form</h1>
   <form (ngSubmit)="onSubmit()" #heroForm="ngForm">   //ngSubmit表单提交
     <div class="form-group">
       <label for="name">Name</label>
       <input type="text" class="form-control" id="name"
              required
              [(ngModel)]="model.name" name="name"   //ngModel数据双向绑定
              #name="ngModel">
       <div [hidden]="name.valid || name.pristine"
            class="alert alert-danger">
         Name is required
       </div>
     </div>
     <div class="form-group">
       <label for="alterEgo">Alter Ego</label>
       <input type="text" class="form-control" id="alterEgo"
              [(ngModel)]="model.alterEgo" name="alterEgo">
     </div>
     <div class="form-group">
       <label for="power">Hero Power</label>
       <select class="form-control" id="power"
               required
               [(ngModel)]="model.power" name="power"
               #power="ngModel">
         <option *ngFor="let pow of powers" [value]="pow">{{pow}}</option>
       </select>
       <div [hidden]="power.valid || power.pristine" class="alert alert-danger">  //表单字段验证
         Power is required
       </div>
     </div>
     <button type="submit" class="btn btn-success" [disabled]="!heroForm.form.valid">Submit</button>
     <button type="button" class="btn btn-default" (click)="newHero(); heroForm.reset()">New Hero</button>
   </form>
 </div>
 <div [hidden]="!submitted">
   <h2>You submitted the following:</h2>
   <div class="row">
     <div class="col-xs-3">Name</div>
     <div class="col-xs-9  pull-left">{{ model.name }}</div>
   </div>
   <div class="row">
     <div class="col-xs-3">Alter Ego</div>
     <div class="col-xs-9 pull-left">{{ model.alterEgo }}</div>
   </div>
   <div class="row">
     <div class="col-xs-3">Power</div>
     <div class="col-xs-9 pull-left">{{ model.power }}</div>
   </div>
   <br>
   <button class="btn btn-primary" (click)="submitted=false">Edit</button>
 </div>
</div>

四、ngModel表单Angular CSS 类来更新控件

状态为真时的 CSS 类为假时的 CSS 类
控件被访问过。ng-touchedng-untouched
控件的值变化了。ng-dirtyng-pristine
控件的值有效。ng-validng-invalid

五、在线实例:在线例子,实例下载:可下载的例子


上一篇:Angularjs4.0 事件绑定机制

下一篇:TypeScript学习笔记1:安装