当前位置: 首页 > Web前端 > CSS

Angular6的响应式表单

时间:2023-03-30 16:19:36 CSS

1:在AppModule模块中引入ReactiveFormsModule要使用响应式表单,请从@angular/forms包中导入ReactiveFormsModule并将其添加到NgModule的导入数组中。import{ReactiveFormsModule}from'@angular/forms';@NgModule({imports:[//otherimports...ReactiveFormsModule],})exportclassAppModule{}2:创建新组件nggcNameEditor3:请输入组件在FormControl类中导入FormControl类是角度响应式表单最基本的构造块。要注册单个表单控件,请在组件中导入FormControl类,创建一个新的FormControl实例,并将其保存在属性中。从'@angular/core'导入{Component};从'@angular/forms'导入{FormControl};@Component({选择器:'app-name-editor',templateUrl:'./name-editor.component.html',styleUrls:['./name-editor.component.css']})exportclassNameEditorComponent{name=newFormControl('');}4:在组件模板中注册一个表单控件修改模板,是一个表单control添加formControl绑定,formControl由ReactiveFormsModule中的FormControlDirective提供。

值:{{name.value}}

使用此模板绑定语法,将表单控件注册到模板中名为name的输入元素。这样,表单控件和DOM元素就可以相互通信:视图将反映模型的变化,而模型将反映视图的变化。5:替换表单控件的值FormControl提供了一个setValue()方法,该方法会修改表单控件的值。jsupdateName(){this.name.setValue('南希');}html

值:{{name.value}}

UpdateName

在这个例子中,你只使用了单个控件FormControl,但是当调用FormGroup或者使用FormArray的setValue()方法时,传入的值必须匹配结构体控制组或控制阵列。6:组窗体控件。FormControl实例可以控制单个输入框对应的控件,FormGroup可以控制一组FormControl实例。创建FormGroup时,每个控件将按名称跟踪1>:创建新组件nggcProfileEditor2>:导入FormGroup和FormControl类并创建FormGroup实例import{Component}from'@angular/core';import{FormGroup,FormControl}来自'@angular/forms';@Component({selector:'app-profile-editor',templateUrl:'./profile-editor.component.html',styleUrls:['./profile-editor.component.css']})exportclassProfileEditorComponent{profileForm=newFormGroup({firstName:newFormControl(''),lastName:newFormControl(''),});}现在这些单独的控件FormControl被收集到一个控件组中FormGroup,FormGroup实例与FormControl实例具有相同的属性(如value,untouched)和方法(如setValue())3>:与FormGroup关联的模型和视图可以跟踪每个单独控件的状态和变化FormControl,如果其中一个控件的状态或值改变时,父控件也会有新的状态改变或值改变事件profileForm通过[formGroup]指令,在模型和表单FormControlName命令的输入框之间创建了一个通信层,FormControlName命令提供的formControlName属性将每个输入框与FormGroup中定义的表单控件绑定在一起。4>:关联FormGroup的model和viewhtml提交jsonSubmit(){console.warn(this.),lastName:newFormControl(''),address:newFormGroup({street:newFormControl(''),city:newFormControl(''),state:newFormControl(''),zip:newFormControl('')})});html
提交部分模型修改htmlUpdateProfilejsupdateProfile(){this.profileForm.patchValue({firstName:'Nancy',address:{street:'123DrewStreet'}});}patchValue()方法更新模型的结构。patchValue()只会更新表单模型中定义的那些属性。6:使用FormBuilder生成表单控件FormBuilder服务提供了一些方便的方法来生成表单控件。FormBuilder在幕后以相同的方式创建和返回这些实例,只是使用起来更简单。下面将重构ProfileEditor组件,使用FormBuilder代替手动创建这些FormControl和FormGroup。第1步-导入FormBuilder类import{FormBuilder}from'@angular/forms';Step2-InjectFormBuildserviceconstructor(privatefb:FormBuilder){}Step3-生成表单控件FormBuilder服务有三个方法:control()、group()和array()。这些方法是组件类中分别生成FormControl、FormGroup和FormArray的工厂方法。您可以使用与以前相同名称的group()方法来定义这些属性。这里,每个控件名称对应的值是一个数组,这个数组的第一项就是它的初始值。您可以定义仅具有初始值的控件,但如果您的控件还需要同步或异步验证器,请在此数组的第二项和第三项中提供同步和异步验证器。从'@angular/core'导入{组件};从'@angular/forms'导入{FormBuilder};@Component({selector:'app-profile-editor',templateUrl:'./profile-editor.component.html',styleUrls:['./profile-editor.component.css']})exportclassProfileEditorComponent{profileForm=this.fb.group({firstName:['Zhang'],lastName:['喜'],address:this.fb.group({street:[''],city:[''],state:[''],压缩:['']}),});constructor(privatefb:FormBuilder){}}7:简单的表单验证如何将单个验证器添加到表单控件,以及如何显示表单的整体状态。第1步-导入验证器函数import{Validators}from'@angular/forms';响应式表单包含一组开箱即用的常用验证器函数。这些函数采用控件来验证并根据验证结果返回错误对象或null。第2步-将字段设为必填最常见的验证是将字段设为必填。本节介绍如何为firstName控件添加“必填字段”验证器。在组件中,将静态方法Validators.required设置为firstName控件值数组中的第二项。profileForm=this.fb.group({firstName:['',Validators.required],lastName:[''],address:this.fb.group({street:[''],city:[''],国家的邮编:['']}),});HTML5有一组用于原生验证的内置属性,包括required、minlength、maxlength等。虽然是可选的,但您也可以通过将它们添加为表单输入元素的附加属性来使用它们。这里我们将required属性添加到firstName输入元素。这些HTML5验证器属性可以与Angular响应式表单提供的内置验证器结合使用。结合这两种验证器实践可以防止在检查模板后再次修改表达式而导致的错误。8:显示窗体的状态现在,你给窗体控件添加了一个必填字段,它的初始值是无效的(invalid)。这种无效状态会向上冒泡到其父FormGroup,从而使FormGroup的状态也无效。您可以通过其状态属性访问FormGroup实例的当前状态。

FormStatus:{{profileForm.status}}

9:使用表单数组管理动态控件FormArray是FormGroup之外的另一种选择,用于管理任意数量的匿名控件,如果你不知道子预先设置控件的个数,FormArray是个不错的选择Step1-ImportFormArrayimport{FormArray}from'@angular/forms';第2步-定义FormArray为profileForm添加别名属性,将其定义为FormArray类型。(FormBuilder服务用于创建FormArray实例。)profileForm=this.fb.group({firstName:['Zhang',Validators.required],lastName:['to'],address:this.fb.group({street:[''],city:[''],state:[''],zip:['']}),别名:this.fb.array([this.fb.control('')])});Step3-通过getter访问FormArray控件访问控件更方便,也便于复用。使用getter语法创建一个名为aliases的类属性getaliases(){}从父控件FormGroup接收昵称的FormArray控件。getaliases(){returnthis.profileForm.get('aliases')asFormArray;}addAlias(){this.aliases.push(this.fb.control(''));}步骤3-在表单中显示模板数组在模型中定义了别名的FormArray之后,您必须将其添加到模板中以供用户输入,使用formArrayName建立此FormArray与模板之间的绑定。

Aliases

AddAlias
每当一个新的时候添加了一个别名,FormArray根据这个索引号提供它的控件。这将允许您在每次计算根控件的状态和值时跟踪每个控件。全部代码html

Address

别名

添加别名提交

UpdateProfile

FormStatus:{{profileForm.status}}

jsimport{Component,OnInit}from'@angular/core';从'@angular/forms'导入{FormControl,FormGroup,FormBuilder,Validators,FormArray};@Component({selector:'app-profile-editor',templateUrl:'./profile-editor.component.html',styleUrls:['./profile-editor.component.css']})exportclassProfileEditorComponentimplementsOnInit{profileForm=this.fb.group({firstName:['张',Validators.required],lastName:['以'],address:this.fb.group({street:[''],city:[''],state:[''],zip:['']}),别名:this.fb.array([this.fb.control('')])});构造函数(私有efb:FormBuilder){}ngOnInit(){}onSubmit(){console.warn(this.profileForm.value);}updateProfile(){this.profileForm.patchValue({firstName:'Nancy',address:{street:'123DrewStreet'}});}getaliases(){returnthis.profileForm.get('aliases')asFormArray;}addAlias(){this.aliases.push(this.fb.control(''));}}

最新推荐
猜你喜欢