Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法


Posted in Javascript onJune 29, 2017

“对呀对呀!……回字有四样写法,你知道么?”,当时鲁大大如此讽刺孔乙己,意味着老孔这个被科举制毒害的人注意此种无用之物实在可悲。但是在Angular 2的世界中,很少存在无用之物,ngModel有三种写法,你知道吗?

表单的设计永远都是应用的重头戏,而其中最基本的功能点即是通过一个个输入组件实现的,为此Angular 2为我们提供了锋利的武器:ngModel。而其不同的使用方式有着大不相同的作用:

ngModel

如果单独使用ngModel,且没有为其赋值的话,它会在其所在的ngForm.value对象上添加一个property,此property的key值为ngModel所在组件设置的name属性的值:

<form novalidate #f="ngForm">
 <input type='text' name='userName' placeholder='Input your userName' ngModel>
</form>
<p>
 {{ f.value | json }} // { "userName": "" }
</p>

此时需要注意的是,单独使用ngModel时,如果没有为ngModel赋值的话,则必须存在name属性。

也就是说,单独ngModel的作用是通知ngForm.value,我要向你那里加入一个property,其key值是组件的name属性值,其value为空字符串。

[ngModel]

可是,如果想向ngForm中添加一个有默认值的property需要怎么做呢?这时就需要使用单向数据绑定的格式了,也就是[ngModel]:

this.model = {
 userName: 'Casear'
};

<form novalidate #f="ngForm">
 <input type='text' name='userName' placeholder='Input your userName' [ngModel]='model.userName'>
</form>
<p>
 {{ f.value | json }} // { "userName": "Casear" }
 {{ model | json }}  // { "userName": "Casear" },不会随着f.value的变化而变化
</p>

这里我们使用了单向数据绑定的特点,可以为ngForm.value添加一个带有初始值的property。

注意单向数据绑定的特点,此时在表单输入框中做的任何改变都不会影响model中的数据,也就是说this.model.userName不会随着输入框的改变而改变。不过输入框改变会体现在f.value中。

[(ngModel)]

上述的单向数据绑定在单纯地提供初始值很有用,不过总是有些场景需要将用户输入体现在我们的model上,此时就需要双向数据绑定了,也即[(ngModel)]:

this.model = {
 userName: 'Casear'
};

<form novalidate #f="ngForm">
 <input type='text' name='userName' placeholder='Input your userName' [(ngModel)]='model.userName'>
</form>
<p>
 {{ f.value | json }} // { "userName": "Casear" }
 {{ model | json }}  // { "userName": "Casear" },会随着f.value的变化而变化
</p>

这里我们不仅为ngForm.value添加了一个带有初始值的property,还能实现Model和View层的联动,尽管这种方式可能并不好,但是在某些情况下也不失为一种简便的方案。

关于[(ngModel)]的内部逻辑可查看Angular 2 父子组件数据通信。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript面向对象设计二 构造函数模式
Dec 20 Javascript
一个可拖拽列宽表格实例演示
Nov 26 Javascript
js控制滚动条缓慢滚动到顶部实现代码
Mar 20 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
jQuery validate插件功能与用法详解
Dec 15 Javascript
vue-cli项目中怎么使用mock数据
Sep 27 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
React全家桶环境搭建过程详解
May 18 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 Javascript
利用Node.js如何实现文件循环覆写
Apr 05 Javascript
js表达式与运算符简单操作示例
Feb 15 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之面向对象_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之json_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 #Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 #Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 #Javascript
You might like
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
php2html php生成静态页函数
2008/12/08 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
python实现抖音视频批量下载
2018/06/20 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
python集合的新增元素方法整理
2020/12/07 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
入党综合考察材料
2014/06/02 职场文书
技术负责人任命书
2014/06/05 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
本溪关门山导游词
2015/02/09 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
工作态度检讨书范文
2015/05/06 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
Java使用jmeter进行压力测试
2021/07/09 Java/Android