Angular2 之 Form 表单
From表单分为两种类型:
@angular/forms 关注点是表单的行为,不是怎么生成DOM。关注点是出错了,是一种出错的状态,是否发生了改变。 Template-Driven Forms
<div class="container">
<h1>Hero Form</h1> {{diagnostic}} <form> <div class="form-group"> <label for="name">Name</label> <input type="text" class="form-control" id="name" required [(ngModel)]="model.name" name="name"> TODO:remove this: {{model.name}} </div> <div class="form-group"> <label for="alterEgo">Alter Ego</label> <input type="text" class="form-control" id="laterEgo" [(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"> <option *ngFor="let p of powers" [value]="p">{{p}}</option> </select> </div> </form> </div>
我们可以在name的 <input type="text" class="form-control" id="name" required [(ngModel)]="model.name" name="name" #spy >
<br>TODO: remove this: {{spy.className}} // 这样显示className
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" id="name" required [(ngModel)]="model.name" name="name" #spy="ngModel">
TODO:remove this: {{model.name}}| {{spy.className}}
</div>
<div [hidden]="spy.valid || spy.pristine" class="alter alter-danger">
Name IS required!
</div>
#spy=”ngModel”
<button type="submit" class="btn btn-default" [disabled]="!heroForm.form.valid">Submit</button>
Model-Driven-Forms有时候手动编写和维护表单所需工作量和时间会过大。特别是在需要编写大量表单时。表单都很相似,而且随着业务和监管需求的迅速变化,表单也要随之变化,这样维护的成本过高。
程序启动我们将使用响应式表单(Reactive Forms)。 响应式表单属于另外一个叫做ReactiveFormsModule的NgModule,所以,为了使用响应式表单类的指令,我们得往@angular/forms库中引入ReactiveFormsModule模块。并且需要引入 自定义表单自定义表单的例子 模板驱动表单的实现例子pdf文档的名字:Custom Form Controls in Angular 2 by thoughtram.pdf 下面是一个使用表单的例子。 import { Component,forwardRef } from '@angular/core';
import { ControlValueAccessor,NG_VALUE_ACCESSOR } from '@angular/forms';
// 所谓表单指的就是,数据从model-->view,然后再从view-->model的这样的一些项,类似的有`input`,`select`,`textarea`等这样的。
@Component({
template: `
<input type="text" [(ngModel)]="value">
`,providers: [
{
provide: NG_VALUE_ACCESSOR,useExisting: forwardRef(() => CustomerFormItemComponent),multi: true,},],})
class CustomerFormItemComponent implements ControlValueAccessor {
private propagateChange: (_: any) => {};
private _value: String; // 为了避免出现死循环,所以设置一个_value
// 如果只设置get方法的话,可以设置只读
get value() {
return this._value;
}
// 这种写法是语法级别的,set方法可以很好的监听传入值的改变。
set value(value: String) {
if (this._value === value) {
return;
} else {
this._value = value;
this.propagateChange(value);
}
}
// 表单初始化的时候,完成model --> view 的数据设置。
writeValue(value: String): void {
this._value = value;
}
registerOnChange(fn: any): void {
this.propagateChange = fn;
}
registerOnTouched(fn: any): void {
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |