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 相关文章推荐
json数据与字符串的相互转化示例
Sep 18 Javascript
js中生成map对象的方法
Jan 09 Javascript
jquery操作select大全
Apr 25 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
Aug 10 Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 Javascript
Vuejs 单文件组件实例详解
Feb 09 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
Vue组件通信中非父子组件传值知识点总结
Dec 05 Javascript
ES2020系列之空值合并运算符 '??'
Jul 22 Javascript
Vue路由 重定向和别名的区别说明
Sep 09 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
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
javascript伸缩型菜单实现代码
2015/11/16 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python最长公共子串算法实例
2015/03/07 Python
详解Django中Request对象的相关用法
2015/07/17 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Python中str.join()简单用法示例
2018/03/20 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Django中使用Celery的方法示例
2018/11/29 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python小程序实现刷票功能详解
2019/07/17 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
管道维修工岗位职责
2013/12/27 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
先进个人总结范文
2015/02/15 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers