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 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
window.addeventjs事件驱动函数集合addEvent等
Feb 19 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
js代码实现无缝滚动(文字和图片)
Aug 20 Javascript
js利用clipboardData实现截屏粘贴功能
Oct 12 Javascript
利用Bootstrap实现表格复选框checkbox全选
Dec 21 Javascript
深入了解javascript 数组的sort方法
Jun 01 Javascript
详解如何在微信小程序中愉快地使用sass
Jul 30 Javascript
Vue.js 事件修饰符的使用教程
Nov 01 Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 Javascript
js验证密码强度解析
Mar 18 Javascript
微信小程序实现底部弹出框
Nov 18 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显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
基于PHP静态类的原罪详解
2013/05/06 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
javascript打印输出json实例
2013/11/11 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
Python argv用法详解
2016/01/08 Python
pycharm安装图文教程
2017/05/02 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python实现简单名片管理系统
2018/11/30 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
锦旗标语大全
2014/06/23 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
党小组鉴定意见
2015/06/02 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
解决hive中导入text文件遇到的坑
2021/04/07 Python
解决python存数据库速度太慢的问题
2021/04/23 Python