一、理解 $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

最新文章

  1. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column &#39;dd&#39; in &#39;where clause&#39;
  2. P1311 选择客栈
  3. vector容器总结.xml
  4. python学习视频整理
  5. hadoop-1.1.0 rpm + centos 6.3 64虚拟机 + JDK7 搭建分布式集群
  6. Type safety: Unchecked cast from Object to ArrayList
  7. python进阶---Python中的socket编程
  8. cf B. Mishka and trip (数学)
  9. 深入理解JVM垃圾收集机制(JDK1.8)
  10. USB Audio设计与实现
  11. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
  12. 网络基础 外网IP,内网IP,虚拟机的网络设置
  13. git window安装与注册邮箱用户名
  14. day2作业(基本数据类型,语法)
  15. hdu 1.2.3
  16. Number Clicker CodeForces - 995E(双向bfs)
  17. 【SqlServer】SqlServer存储过程使用
  18. HTTP协议的前世今生——各版本HTTP协议对比
  19. Android sdcard文件读写操作
  20. (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号

热门文章

  1. 201871020225-牟星源《面向对象程序设计(JAVA)》第二周学习总结
  2. SparkSQL 中 RDD 、DataFrame 、DataSet 三者的区别与联系
  3. vue文件夹上传组件选哪个好?
  4. T4模板 简单使用
  5. hdu5111 树链剖分,主席树
  6. ZROI 暑期高端峰会 A班 Day3 图论
  7. 安卓设备连接Mac的简单方法
  8. php获取客户端公网ip代码
  9. Docker&amp;持续集成与容器管理--系列教程
  10. 【Shiro学习之一】Shiro入门