当前位置: 首页 > news >正文

AngularJS ng-model 指令

AngularJS ng-model 指令

ng-model是 AngularJS 中最重要的指令之一,用于实现双向数据绑定(Two-way Data Binding)。它将表单控件的值与作用域(Scope)中的属性绑定在一起,使得数据的变化能够自动同步。

一、基本概念

1. 什么是双向数据绑定

双向数据绑定意味着:

  • 视图 → 模型:用户在表单控件中输入数据时,自动更新作用域中的变量
  • 模型 → 视图:作用域中的变量变化时,自动更新表单控件的显示值
┌─────────────┐ ┌─────────────┐ │ 视图 │ ←→ │ 模型 │ │ (表单控件) │ │ (Scope变量) │ └─────────────┘ └─────────────┘

2. 基本语法

<inputtype="text"ng-model="变量名">
// 控制器中$scope.name="张三";

二、基本用法

1. 文本输入框

<divng-app="myApp"ng-controller="MyCtrl"><inputtype="text"ng-model="name"placeholder="请输入姓名"><p>你输入的是:{{ name }}</p></div>
angular.module('myApp').controller('MyCtrl',function($scope){$scope.name="初始值";});

2. 文本域

<textareang-model="description"rows="4"cols="50"></textarea><p>描述:{{ description }}</p>

3. 数字输入

<inputtype="number"ng-model="age"min="0"max="120"><p>年龄:{{ age }}</p>

三、不同表单控件的使用

1. 复选框

单个复选框
<inputtype="checkbox"ng-model="isChecked"><p>状态:{{ isChecked ? "已选中" : "未选中" }}</p>
复选框组
<divng-repeat="item in items"><inputtype="checkbox"ng-model="item.selected"id="item-{{ $index }}"><labelfor="item-{{ $index }}">{{ item.name }}</label></div><p>已选:{{ items | filter:{selected:true} | json }}</p>
$scope.items=[{name:'选项1',selected:false},{name:'选项2',selected:false},{name:'选项3',selected:false}];

2. 单选框

<inputtype="radio"ng-model="gender"value="male"><inputtype="radio"ng-model="gender"value="female"><inputtype="radio"ng-model="gender"value="other">其他<p>性别:{{ gender }}</p>

注意:所有单选框的ng-model必须相同,value不同。

3. 下拉框

基本用法
<selectng-model="selectedCity"><optionvalue="">请选择城市</option><optionvalue="beijing">北京</option><optionvalue="shanghai">上海</option><optionvalue="guangzhou">广州</option></select><p>选择的城市:{{ selectedCity }}</p>
使用ng-options(推荐)
<selectng-model="selectedCity"ng-options="city.code as city.name for city in cities"><optionvalue="">-- 请选择 --</option></select><p>代码:{{ selectedCity }}</p><p>名称:{{ getCityName(selectedCity) }}</p>
$scope.cities=[{code:'bj',name:'北京'},{code:'sh',name:'上海'},{code:'gz',name:'广州'}];$scope.getCityName=function(code){varcity=$scope.cities.find(function(c){returnc.code===code;});returncity?city.name:'';};
ng-options语法详解
<!-- 1. 数组:值作为显示文本 --><selectng-model="selected"ng-options="item for item in items"></select><!-- 2. 数组:值和显示文本不同 --><selectng-model="selected"ng-options="item.id as item.name for item in items"></select><!-- 3. 数组:分组 --><selectng-model="selected"ng-options="item.name group by item.category for item in items"></select><!-- 4. 对象:键值对 --><selectng-model="selected"ng-options="key as value for (key, value) in object"></select><!-- 5. 对象:键值对(值作为显示文本) --><selectng-model="selected"ng-options="key for (key, value) in object"></select>

四、ng-model 的修饰符

1.ng-model-options

控制数据绑定的行为。

<!-- 延迟更新(失去焦点时才更新) --><inputtype="text"ng-model="name"ng-model-options="{ updateOn: 'blur' }"><!-- 防抖(延迟 500ms 更新) --><inputtype="text"ng-model="name"ng-model-options="{ debounce: 500 }"><!-- 多事件触发 --><inputtype="text"ng-model="name"ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"><!-- 允许无效值 --><inputtype="email"ng-model="email"ng-model-options="{ allowInvalid: true }">

2.ng-trim

自动去除输入值的首尾空格(默认为true)。

<!-- 自动去除空格 --><inputtype="text"ng-model="name"ng-trim="true"><!-- 保留空格 --><inputtype="text"ng-model="name"ng-trim="false">

五、表单验证与 ng-model

ng-model与表单验证紧密相关,通过$error$valid/$invalid等属性进行验证。

1. 基本验证

<formname="myForm"novalidate><inputtype="text"name="username"ng-model="username"requiredng-minlength="3"ng-maxlength="10"ng-pattern="/^[a-zA-Z]+$/"><png-show="myForm.username.$error.required">用户名必填</p><png-show="myForm.username.$error.minlength">至少3个字符</p><png-show="myForm.username.$error.maxlength">最多10个字符</p><png-show="myForm.username.$error.pattern">只能包含字母</p><p>有效:{{ myForm.username.$valid }}</p><p>无效:{{ myForm.username.$invalid }}</p><p>脏:{{ myForm.username.$dirty }}</p><p>原始:{{ myForm.username.$pristine }}</p></form>

2. 表单状态属性

属性说明
$valid表单/字段是否有效
$invalid表单/字段是否无效
$pristine表单/字段是否未被修改
$dirty表单/字段是否已被修改
$touched表单/字段是否已被触碰
$untouched表单/字段是否未被触碰
$error包含所有验证错误的对象

3. 实时验证示例

<formname="myForm"novalidate><divclass="form-group"ng-class="{ 'has-error': myForm.email.$invalid && myForm.email.$dirty }"><label>邮箱</label><inputtype="email"name="email"ng-model="email"required><pclass="help-block"ng-show="myForm.email.$error.required && myForm.email.$dirty">邮箱必填</p><pclass="help-block"ng-show="myForm.email.$error.email && myForm.email.$dirty">邮箱格式不正确</p></div><buttontype="submit"ng-disabled="myForm.$invalid">提交</button></form>

六、高级用法

1. 自定义指令中使用 ng-model

angular.module('myApp').directive('myInput',function(){return{restrict:'E',require:'ngModel',template:'<input type="text" ng-model="ngModel">',scope:{ngModel:'='},link:function(scope,element,attrs,ngModelCtrl){// 访问 ngModelControllerngModelCtrl.$formatters.push(function(value){// 格式化模型值到视图returnvalue?value.toUpperCase():'';});ngModelCtrl.$parsers.push(function(value){// 解析视图值到模型returnvalue?value.toLowerCase():'';});}};});

2.$formatters$parsers

// 在控制器中$scope.$watch('price',function(newVal){// 监听模型变化});// 在自定义指令中link:function(scope,element,attrs,ngModelCtrl){// 模型 → 视图(格式化)ngModelCtrl.$formatters.push(function(modelValue){returnmodelValue?modelValue.toFixed(2):'';});// 视图 → 模型(解析)ngModelCtrl.$parsers.push(function(viewValue){returnparseFloat(viewValue);});}

3.$validators$asyncValidators

// 同步验证ngModelCtrl.$validators.custom=function(modelValue,viewValue){returnmodelValue&&modelValue.length>=3;};// 异步验证ngModelCtrl.$asyncValidators.unique=function(modelValue,viewValue){return$http.get('/api/check-username',{username:modelValue}).then(function(response){returnresponse.data.available;});};

七、常见问题与最佳实践

1. 避免在ng-repeat中直接使用原始类型

<!-- 不推荐 --><divng-repeat="item in [1, 2, 3]"><inputtype="checkbox"ng-model="item"></div><!-- 推荐 --><divng-repeat="item in items"><inputtype="checkbox"ng-model="item.checked"></div>

2. 使用ng-model-options优化性能

<!-- 搜索框:使用防抖减少更新频率 --><inputtype="text"ng-model="searchText"ng-model-options="{ debounce: 300 }"placeholder="搜索...">

3. 处理初始值

// 确保模型有初始值$scope.user={name:'',email:'',gender:'male'// 默认值};

4. 避免在表达式中直接修改模型

<!-- 不推荐 --><inputtype="text"ng-model="name"ng-change="name = name.toUpperCase()"><!-- 推荐 --><inputtype="text"ng-model="name"ng-change="formatName()">
$scope.formatName=function(){$scope.name=$scope.name.toUpperCase();};

八、总结

ng-model是 AngularJS 双向数据绑定的核心,通过它可以轻松实现表单控件与模型数据的同步。掌握ng-model的各种用法、修饰符和验证机制,是构建响应式表单应用的关键。

关键点

  • 双向绑定:视图 ↔ 模型自动同步
  • 支持多种表单控件:文本、复选框、单选框、下拉框
  • 配合表单验证:$valid,$invalid,$error
  • 修饰符:ng-model-options,ng-trim
  • 高级功能:$formatters,$parsers,$validators
http://www.jsqmd.com/news/673381/

相关文章:

  • PCB绘制
  • Blazor + WASM + WebGPU 实时渲染面试突击包:含WebAssembly SIMD加速、GPU缓冲区绑定、帧同步调试全流程(仅限Q2开放下载)
  • 大恒相机取消曝光限制(超长曝光)设置与代码实现(C/C++/C#)
  • WinClaw安全实战 10|5分钟微信接入指南:零代码远程操控电脑,AI助手随身带
  • Gemini CLI Skills 技能扩展全景指南:内置、社区与自定义三条路径
  • 当今工程师Superpowers进化论:从VibeCoding到Agent IDE,源码级重构你的编码内核!
  • Debian 12.5 一键安装 Oracle 11GR2 单机
  • 告别CANtest和ECAN Tools:用Python脚本玩转ZLG/创芯CAN盒的自动化测试
  • 昆仑天工AI突破:游戏世界生成器实现实时可探索虚拟空间创建能力
  • EMCC 13.5 安装中断,如何清理 OMS 库?
  • Z-Image-Turbo Web服务日志调试:从backend/main.py异常堆栈定位LoRA加载失败
  • 2026 年了,为什么你还在手动安装 Oracle 数据库?
  • Modelsim仿真遇到vsim-12027和vlog-13276?可能是你的Verilog连接和例化出了这些细节问题
  • 2026年粉笔教育深度测评:AI如何重塑职业教育新范式?
  • 【Dify国产化测试黄金标准】:12类中间件兼容矩阵、5轮压力测试阈值、4项国密SM4/SM2集成验证
  • ExifToolGUI完整指南:告别命令行,图形化批量管理照片元数据的终极方案
  • Debian 8 一键安装 Oracle 11GR2 单机
  • 收藏 | 程序员必看:从传统开发转向AI Agent开发的三大转型路径,未来属于谁
  • 2026 年还值得学 Oracle 吗?一个 DBA 的真实看法
  • Debian 12.5 一键安装 Oracle 19C 单机
  • 构建第二曲线:软件测试工程师的零成本副业变现全攻略
  • 九星创客商城系统 - 三匠互联土土哥
  • Debian 8 一键安装 Oracle 19C 单机
  • SAP 清账凭证 底层完整生成逻辑(无冗余、纯原理 + 分录规则 + 边界场景)
  • 一些C++二级刷题网站
  • 北京律所 GEO 优化效果实测 品帮科技服务商对比 - 外贸老黄
  • 19C 19.22 RAC 2节点一键安装演示
  • DBA 必看:Oracle 许可合规性检查终极指南
  • C# 创建vba用的类库
  • 【C# 14原生AOT实战指南】:3步完成Dify客户端极简部署,告别IL打包时代!