$parsers & $formatters

Posted isnan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$parsers & $formatters相关的知识,希望对你有一定的参考价值。

一、理解 $parsers 和 $formatters

  Angular 是MVVM框架,model层数据变化了会通知view层更新,同样的view层更新了也会通知到model

  $parsers 和 $formatters 就是储存与ngModel中的管道函数的数组集合

  由model到view的变化会依次触发 $formatters 中的函数

  反之,由view到model的变化会依次触发 $parsers 中的函数

二、代码

 1 <div ng-controller="myController">
 2     <form name="myForm" novalidate>
 3         <input
 4             type="text" 
 5             name="amount" 
 6             ng-model="test"
 7             required
 8             nan-form-max="200"
 9             ng-click="showErr()"
10         >
11             <p ng-show="myForm.amount.$error.required">不能为空</p>
12             <p ng-show="myForm.amount.$error.nanFormMax">不能大于200</p>
13     </form>
14 </div>
 1 angular
 2     .module("myApp", [])
 3     .directive(‘nanFormMax‘, nanFormMax)
 4     .controller(‘myController‘, function ($scope, $timeout) {
 5         // $scope.test = "1231";
 6         $timeout(() => {
 7             $scope.test = 123;
 8         }, 2000)
 9         $scope.showErr = function () {
10             // console.log($scope.myForm);
11         }
12     })
13 
14     function nanFormMax() {
15         return {
16             restrict: ‘A‘, // E element / A attribute / C class / M comment
17             require: ‘?ngModel‘, // NgModelController是用来为ng-model提供了一组API
18             link: function (scope, element, attrs, ctrl) {
19                 if (!ctrl) {
20                     return;
21                 }
22                 let max = 0;
23                 // $observe是Attrbutes(attrs)对象的一个方法
24                 // 它只能被用于观察DOM的attribute属性的值的改变
25                 // 只能被指令内部使用或调用。
26                 attrs.$observe(‘nanFormMax‘, function (value) {
27                     let floatVal = parseFloat(value, 10);
28                     max = isNaN(floatVal) ? 0 : floatVal;
29                 });
30                 // $parsers 是从view到model的变化
31                 ctrl.$parsers.push(function (viewVal) {
32                     console.log(‘$parsers方法被调用‘);
33                     return checkVal(viewVal);
34                 });
35                 // $formatters 是从 model 到 view 的变化
36                 ctrl.$formatters.push(function(viewVal){
37                     console.log(‘$formatters方法被调用‘);
38                     return checkVal(viewVal);
39                 });
40 
41                 function checkVal (viewVal) {
42                     if (viewVal > max) {
43                         ctrl.$setValidity(‘nanFormMax‘, false);
44                     } else {
45                         ctrl.$setValidity(‘nanFormMax‘, true);
46                     }
47                     return viewVal;
48                 }
49             }
50         }
51     }

 三、$scope.myForm & $scope.myForm.amount

技术图片

技术图片

以上是关于$parsers & $formatters的主要内容,如果未能解决你的问题,请参考以下文章

在Angularjs中格式化输入值

LL&LR parser

Handwritten Parsers & Lexers in Go (Gopher Academy Blog)

理解 fmt formatter 解析函数

Linux From Scratch(LFS11.0)构建 LFS 系统 - XML::Parser-2.46

Linux From Scratch(LFS11.0)构建 LFS 系统 - XML::Parser-2.46