模板式表单

表单数据模型通过组件模板中的相关指令定义,但是只适用于一些简单的场景。比较死板

指令:来自FormsModule模块中

在app.modules.ts中

import { FormsModule } from "@angular/forms";
@NgModule({  declarations: [

  ],  imports: [    FormsModule  ],

})

ngForm 作用

1.ngForm指令可以发现所有标有 ‘ngModel’的子元素,并将其值添加到表单模型中 创建FormGroup的实例,将数据存储在ngForm.value对象中。

2.任何标有“ngForm”指令的元素都会有此作用。不论是不是form表单元素

3.当不希望Angular接管表单时,可给表单标签添加“ngNoForm”指令。

4.ngForm指令可以被模板本地变量引用,来访问模板表单的实例

5.会阻止表单的提交并刷新,使用**ngSubmit**事件来提交

6.隐式创建FormGroup类型的实例

ngModel 作用

1.ngModel是ngForm指令所在元素的子元素的字段,与name属性相关联(仅当添加name属性后才能被模板捕获,创建数据模型)。

2.会隐式创建FormControl的实例,来代表该字段,并用FormControl创建的对象存储其值。

3.ngModel代表一个字段,而不是双向绑定,不需要绑定变量,也不需要在组件中声明变量。

4.ngModel指令可以被模板本地变量引用,来访问模板表单的字段的值。

ngFormGroup 作用:

1.与ngForm类似,也会创建FormGroup的实例,该数据是嵌套在ngForm.value对象中的。

2.用来将有联系的表单元素放置于一块,并组成对象格式数据。

示例:

在app.module.ts导入FormsModule:

import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { FormsModule } from "@angular/forms";import { AppRoutingModule } from './app-routing.module';import { AppComponent } from './app.component';import { HeaderComponent } from './components/header/header.component';

@NgModule({  declarations: [    AppComponent,    HeaderComponent  ],  imports: [    BrowserModule,    AppRoutingModule,    FormsModule  ],  providers: [],  bootstrap: [AppComponent]})export class AppModule { }

在app.component.html:

<h1>

  {{ msg }}h1><form #myForm="ngForm" (ngSubmit)="createUser(myForm.value)">    

  <div>姓名:<input type="text" #myName="ngModel" ngModel name="myname">div>

  <div>邮箱:<input type="email" ngModel name="email">div>  <div>手机号:<input type="number" ngModel name="mobile">div>  <div ngModelGroup="passwordInfo">      <div>密码:<input type="password" ngModel name="password">div>      <div>确认密码:<input type="password" ngModel name="passwordConfirm">div>  div>  <button tyoe="submit">注册button>form><div>  {{myForm.value | json}}

div><div>  {{myName.value | json}}

div>

<router-outlet>router-outlet>

在app.component.ts中:

import { Component } from '@angular/core';

@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.scss']})export class AppComponent {  #myForm="ngForm"  msg = '欢迎来到码上加油站';  createUser(info: any) {    console.log(info);}}

运行项目:

响应式表单

通过typescript创建底层的数据模型。可通过特定的指令将模板上的HTML元素和底层的数据模型相联系。比较灵活。

表单指令:

编写步骤:

(1)用代码编写数据模型

(2)将数据模型与HTML页面ngModel相连接

数据模型:

用来保存表单数据的数据结构,简称模型。

由FormsModule中的三个类组成:FormControl、FormGroup、FormArray.

  • FormControl指代form中的单个字段

  • FormGroup指代form中的所有字段或者有关联的字段,类型为对象,可嵌套

  • FormArray指代form中可能有多个值的字段,类型为数组

示例:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { ReactiveFormsModule } from '@angular/forms';import { AppRoutingModule } from './app-routing.module';import { AppComponent } from './app.component';import { HeaderComponent } from './components/header/header.component';

@NgModule({  declarations: [    AppComponent,    HeaderComponent  ],  imports: [    BrowserModule,    AppRoutingModule,    ReactiveFormsModule,

  ],  providers: [],  bootstrap: [AppComponent]})export class AppModule { }

在app.component.html:

<h1>

  {{ msg }}h1>

<form [formGroup]="formModel" (submit)="createUser()">   

  <div>姓名:<input type="text" formControlName="nickname">div>     <div>邮箱:    <ul formArrayName="emails">     

      <li *ngFor="let email of formModel.get('emails')['controls'];let i = index;">        <input [formControlName]="i">        li>    ul>    <button tyoe="button" (click)="addEmail()">增加emailbutton>

  div>  <div>手机号:<input type="number" formControlName="mobile">div>  <div formGroupName="passwordInfo">                                    

    <div>密码:<input type="password"  formControlName="password">div>    <div>确认密码:<input type="password"  formControlName="passwordConfirm">div>  div>  <button tyoe="submit">注册button>form>

<router-outlet>router-outlet>

在app.component.ts中:

import { Component, OnInit } from '@angular/core';import { FormBuilder, FormGroup, FormArray, FormControl } from '@angular/forms';@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.scss']})export class AppComponent implements OnInit {   formModel: FormGroup;   fb: FormBuilder = new FormBuilder();  msg = "码上加油站"  constructor() {

    this.formModel = new FormGroup({ // 整个表单是FormGroup类型的数据      nickname: new FormControl(), // 昵称为FormControl类型的数据      mobile: new FormControl(),      emails: new FormArray([ // 数组        new FormControl('a@a.com'),        new FormControl('b@b.com')    ]),      passwordInfo: new FormGroup({ // 密码是FormGroup类型的数据,被嵌套在FormGroup中        password: new FormControl(),        passwordConfirm: new FormControl()      })    });  }

  ngOnInit(): void {

  }  addEmail() {    let emails = this.formModel.get('emails') as FormArray;    emails.push(new FormControl());    console.log(this.formModel.value);  }

  createUser() {    console.log(this.formModel.value);  }

}

也可以写成:

import { Component, OnInit } from '@angular/core';import { FormBuilder, FormGroup, FormArray, FormControl } from '@angular/forms';@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.scss']})export class AppComponent implements OnInit {   formModel: FormGroup;   fb: FormBuilder = new FormBuilder();  msg = "码上加油站"  constructor() {    this.formModel = this.fb.group({      nickname: ['hello'],      mobile: [''],      emails: this.fb.array([          ['a@a.com'],          ['b@b.com']      ]),      passwordInfo: this.fb.group({          password: [''],          passwordConfirm: ['']      })  });    // this.formModel = new FormGroup({ // 整个表单是FormGroup类型的数据    // nickname: new FormControl(), // 昵称为FormControl类型的数据    // mobile: new FormControl(),    // emails: new FormArray([ // 数组    // new FormControl('a@a.com'),    // new FormControl('b@b.com')    // ]),    // passwordInfo: new FormGroup({ // 密码是FormGroup类型的数据,被嵌套在FormGroup中    // password: new FormControl(),    // passwordConfirm: new FormControl()    // })    // });  }

  ngOnInit(): void {

  }  addEmail() {    let emails = this.formModel.get('emails') as FormArray;    emails.push(new FormControl());    console.log(this.formModel.value);  }

  createUser() {    console.log(this.formModel.value);  }

}

运行项目:

两种表单的区别

1.都需要数据模型来存储表单数据。

2.数据模型由angular/forms模块中的一些特定的类,如FormControl,FormGroup等组成。

3.模板式表单中,数据模型由组件模板中的指令隐式创建。响应式表单中,数据模型自己来创建,并与HTML元素相连接。

4.模板式表单中,不能访问这些类;而响应式可以。

5.模板式表单只需引入FormsModule模块

6.使用响应式,必须引入 FormsModule、 ReactiveFormsModule这两个模块。

码上加油站

一起来加油

长按扫码关注

记得点个在看哦!

angular元素属性绑定_【Angular】表单相关推荐

  1. angular元素属性绑定_AngularJS语法基础及数据绑定——详解各种数据绑定指令、属性应用...

    AngularJS简单易学,但是功能强大.特别是在构建单页面应用方面效果显著.而 数据绑定 可以说是他被广泛使用的最主要的优点.他舍弃了对DOM的操作方式,一切都由AngularJS来自动更新视图,我 ...

  2. Angular元素属性绑定的一个例子

    如下图的例子:a标签的disabled class绑定到model.active属性的取反值,即如果model.active为false,该标签就为disabled状态. 这个a标签页默认是disab ...

  3. 前端JavaScript DOM BOM 自学复盘 D1(DOM-获取DOM元素、修改HTML标签/表单/css样式属性、定时器-间歇函数)

    内容概要 1. Web API 基本认知 1.1. 作用和分类 1.2. 什么是DOM 1.3. DOM作用 1.4 DOM树 1.4.1. DOM树是什么? 1.4.2. DOM 树的作用 1.5 ...

  4. JS表单的获取、表单元素的获取、提交表单

    获取表单 document.getElementById("id属性值"),通过表单的id属性值获取属性对象 document.表单的name属性值,通过表单的name属性值获取表 ...

  5. HTML基本语法之表单标签:表单的组成 ,表单域,表单控件元素(表单元素) ,input表单元素, label标签, 表单控件(表单元素), select表单元素, textarea表单元素

    文章目录 表单标签 表单的组成 表单域 常用属性: 表单控件元素(表单元素) input表单元素 label标签 表单控件(表单元素) select表单元素 textarea表单元素 表单元素几个总结 ...

  6. jq选择器||基本选择器 层级选择器 属性选择器 过滤选择器 表单过滤选择器

    基本选择器 层级选择器 属性选择器 过滤选择器 表单过滤选择器 1. 基本选择器        1. 标签选择器(元素选择器)                 * 语法: $("html标签 ...

  7. html5基础(网页基本标签、图像标签、超链接、列表、表格、媒体元素、iframe框架、表单)

    网页的基本信息 1.DOCTYPE声明 文档类型的声明,约束HTML文档结构,检验是否符合相关Web标准,同时告诉浏览器,使用哪种规范来解释这个文档中的代码.DOCTYPE声明必须位于HTML文档第一 ...

  8. java 文本域不可编辑_实现表单input文本框不可编辑的三种方法

    问题 有时,我们需要以不可编辑的模式显示表单域,那么如何实现?我们可以通过为表单字段(input文本框,标签,复选框,文本区域)设置以下方法来实现表单的不可编辑功能. 实现方式 1.οnfοcus=t ...

  9. java 文本框只读_处理表单使input等文本框为只读不可编辑的方法

    方法1: οnfοcus=this.blur() 方法2:readonly 方法3: disabled Readonly和Disabled它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着 ...

最新文章

  1. 【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定
  2. ubuntu 14.04 下通过apt-get 安装jdk
  3. R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型、南非心脏病数据集(South African Heart Disease)
  4. 实际运维中处理的事故问题
  5. 购买Entrust SSL 数字证书?你怎么看?
  6. 自动去除所有目录的隐藏属性的DOS命令
  7. as3.0用了视频组件,导致视频打开后就全屏,加一下代码就行
  8. Kotlin reduce、fold
  9. shell看java控制台_java - 为什么我的shell脚本的输出不能打印在控制台? - SO中文参考 - www.soinside.com...
  10. U-Mail邮件服务系统任意文件上传+执行漏洞(runtime缺陷与验证绕过)
  11. Linux 安装 OpenOffice
  12. php数据库搬家,php 用adodb实现数据库搬家
  13. Linux下配置Hadoop全分布式环境
  14. 飞秋命令行发送消息和文件
  15. 最好用的文件上传插件 bootstrap fileInput
  16. Mysql 8踩坑之1054(42S22):Unkown column ‘password‘ in ‘field list‘ 与1251- Client deos not support authen
  17. Pm2 部署 Nuxt 项目
  18. 音创ktv点歌系统服务器,音创ktv点歌系统家庭版
  19. BLUES吉他学习笔记005 bluesrv[9]
  20. Nodejs教程15:net模块初探

热门文章

  1. 皮一皮:爱迪生看了流泪,特斯拉看了沉默...
  2. 每日一皮:是金子无论到哪里、哪怕变个形状都会发光..
  3. 中国人寿保险研发中心2021校招开始啦!
  4. 每日一皮:实习生将他的代码交给高级开发人员,高级开发反手一个...
  5. Redis 哨兵架构基础
  6. oracle如何降低逻辑读,如何降低该SQL的逻辑读
  7. redis php web管理,redis web管理工具phpRedisAdmin安装
  8. C#机房重构-总结(一)
  9. rknn 学习资料整理
  10. python numpy转字符串