$parsers & $formatters
一、理解 $parsers 和 $formatters
Angular 是MVVM框架,model层数据变化了会通知view层更新,同样的view层更新了也会通知到model
$parsers 和 $formatters 就是储存于ngModel中的管道函数的数组集合
由model到view的变化会依次触发 $formatters 中的函数
反之,由view到model的变化会依次触发 $parsers 中的函数
二、代码
<div ng-controller="myController">
<form name="myForm" novalidate>
<input
type="text"
name="amount"
ng-model="test"
required
nan-form-max="200"
ng-click="showErr()"
>
<p ng-show="myForm.amount.$error.required">不能为空</p>
<p ng-show="myForm.amount.$error.nanFormMax">不能大于200</p>
</form>
</div>
angular
.module("myApp", [])
.directive('nanFormMax', nanFormMax)
.controller('myController', function ($scope, $timeout) {
// $scope.test = "1231";
$timeout(() => {
$scope.test = 123;
}, 2000)
$scope.showErr = function () {
// console.log($scope.myForm);
}
}) function nanFormMax() {
return {
restrict: 'A', // E element / A attribute / C class / M comment
require: '?ngModel', // NgModelController是用来为ng-model提供了一组API
link: function (scope, element, attrs, ctrl) {
if (!ctrl) {
return;
}
let max = 0;
// $observe是Attrbutes(attrs)对象的一个方法
// 它只能被用于观察DOM的attribute属性的值的改变
// 只能被指令内部使用或调用。
attrs.$observe('nanFormMax', function (value) {
let floatVal = parseFloat(value, 10);
max = isNaN(floatVal) ? 0 : floatVal;
});
// $parsers 是从view到model的变化
ctrl.$parsers.push(function (viewVal) {
console.log('$parsers方法被调用');
return checkVal(viewVal);
});
// $formatters 是从 model 到 view 的变化
ctrl.$formatters.push(function(viewVal){
console.log('$formatters方法被调用');
return checkVal(viewVal);
}); function checkVal (viewVal) {
if (viewVal > max) {
ctrl.$setValidity('nanFormMax', false);
} else {
ctrl.$setValidity('nanFormMax', true);
}
return viewVal;
}
}
}
}
三、$scope.myForm & $scope.myForm.amount


随机推荐
- 07-C#笔记-运算符
1. 支持++和-- 含义和C++中相同 2. 条件运算 同C++ 3. 位运算 ^ 异或 ~ 取反 4. 支持?:运算 5. 特殊 is 判断对象是否为某一类型. If( Ford is Car) ...
- 搭建代理服务器时的笔记,request使用笔记
request 请求笔记: 1.opation中使用form字段传参 对应 content-type': 'application/x-www-form-urlencoded',如果想要content ...
- 第二阶段冲刺(个人)——two
今天的计划: 测试登录功能并优化. 昨天做了什么呢? 修改登录界面. 遇到的困难:一些标签运用不好,过程进度慢,改了又改.
- bzoj2187 fraction&&hdu3637 Find a Fraction——类欧几里得
bzoj2187 多组询问,每次给出 $a, b, c, d$,求满足 $\frac{a}{b} < \frac{p}{q} < \frac{c}{d}$ 的所有二元组 $(p, q)$ ...
- MySQL 五大引擎之间的区别和优劣之分
MySQL五大引擎介绍: MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型INNODB和BERKLEY(BDB) ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方 ...
- selenium--浏览器滚动条操作
前戏 在进行web自动化的时候,selenium只能找当前屏幕上的标签,如果标签在当前页面没显示下,需要拖动滚动条才能查看到这个元素,这时候就要操作浏览器的滚动条,让当前页面显示这个元素才可以操作,在 ...
- Python中的next()\iter()函数详解
什么是可迭代的对象(Iterable,即可以用for循环的对象)和迭代器(Iterator) Iterable: 一类是:list.tuple.dict.set.str 二类是:generator(都 ...
- 触发bfc解决父子元素嵌套垂直方向margin塌陷问题
首先看一下问题案例 .wrapper{ width: 100px; height: 100px; background-colo ...
- 第01组 Alpha冲刺(5/6)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11901035.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- Linux上使用yum安装openjdk
来源:https://www.cnblogs.com/yaun1498078591/p/10368884.html 使用yum查找jdk: yum search java|grep jdk # yum ...