$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
随机推荐
- #51nod上topcoder练习记
好久没刷51nod了,又听说topcoder有很多好题.那么就来51nod上刷吧.(那个客户端搞得有点烦(看不懂)) [1366 贫富差距] 当图不连通的时候,答案为无穷大. 当图连通时,两个点之间的 ...
- java 多态(向上转型)
多态的定义与使用格式 多态的定义格式:就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); 普通类多态定义的格式 父类 变量名 = new 子类(); ...
- 专题-主存储器与Cache的地址映射方式
2019/05/02 10:23 首先,我们注意到地址映射有三种:分别是直接地址映射.全相联映射.组相联映射. 首先我们搞清楚主存地址还有Cache地址的关系,还有组内地址的关系,常见我们的块内地址, ...
- 深入js系列-环境
javascript运行环境 js如果只在引擎中运行,它会严格遵循并且可以预测的,但是js几乎都在宿主环境中运行,浏览器或者Node环境 ECMAScript中的Annex B 介绍了浏览器兼容性问题 ...
- Unittest 类方法
import unittest,time from selenium import webdriver class TestClass(unittest.TestCase): @classmethod ...
- Windows远程桌面连接Debian
参考 https://portal.databasemart.com/kb/a457/how-to-install-desktop-environment-and-xrdp-service-in-de ...
- centos gcc编译
centos上面的gcc是4.x的,因为我们使用了c++17,所以想升级成最新的gcc 1. 下载源码 https://gcc.gnu.org/index.html 2. 下载下来是.tar.xz,因 ...
- 运维-nginx +php 错误状态码说明
常用 nginx 错误码: 正常: 200 正常访问 301 永久跳转访问 302 临时跳转访问 常见错误状态码: 400 ,经常有服务器自己调用 自己的情况 用报400,如高防调用高防,或者lv ...
- mysql 基本操作 一
1.mysql 管理语句 1)展示数据库列表 mysql> show databases; +--------------------+ | Database | +-------------- ...
- 解决Spring和SpringMVC扫描注解类的冲突问题
原文地址:https://blog.csdn.net/xiaobao5214/article/details/52042041 最正确的配置方式:在主容器中applicationContext.xml ...