$parsers 首先先了解下它具体的作用,当用户与控制器进行交互的时候。ngModelController中的$setViewValue()方法就会被调用,$parsers的数组中函数就会以流水线的形式被一一调用。第一个$parse被调用后在进行第二个$parse调用
 
这些函数可以对输入值进行转换,后者通过$setValidity()函数设置表达的合法性:
这个方法可以人为的设置一个表单控件的$valid 以及$ invalid, 也就是说改变表单控件是否通过校验的状态.类似的还有$setDirty()和$setPristine().
 
那么具体是实现,用了一些时间做了一个突击测试,也没有花什么时间研究,有不妥也正常,但应该也差不多了
首先$parsers是view 到 model的一个过度,因此当Model不希望有所更新的时候就返回一个undefined。
 
其实初步看它是改变了ngModel的值,但测试会发现你在输入Input里面并没有为空,还是你输入的数,但你会发现如果它被触发了,Model里面的属性就不会更新了,所以因此当Model不希望有所更新的时候就返回一个undefined。这句话是没有问题的。它只是Model不去更新了,但你的view还是会更新的,因为我们输入的内容不还是在ng-model内么,只是他不和Model相连接了,嗯我的理解就是失去了双向绑定的特性,封闭“作用域”。
 
这个服务多用在指令上,那么经过测试发现只要你要用到指令了就必须加上他,即使你感觉根本没有地方调用它,但是它确实是存在那的。
如你把下面的例子ng-test  去点看看  然后加上属性不调用在看看,以及就像我就写个ng-test 看看。
 
那么具体什么时候是model转向view就是另一个内置服务了$formatters,那么这个其实也是$parsers执行后立即调用的服务。这就不多说了。
 
 
//HTML
<div ng-controller="TestController">
  <form name="testForm">
   <input type="text" name="inputs" ng-test ng-model="obj.number">
   <span ng-show="testForm.inputs.$error.test">good</span>
   <span ng-hide="testForm.inputs.$error.test">bad</span>
   <div>{{ testForm.inputs.$valid }}</div>
   <div>{{ testForm.inputs.$invalid }}</div>
   
   <div>{{ obj.number }}</div>
  </form>
 </div>
//Script
 <script type="text/javascript">
  angular.module('myApp', [])
   .controller('TestController', function($scope) {
    $scope.obj = {
     number: 34
    };
   })
   .directive('ngTest', function(){
     return {
       require: '?ngModel',
       restrict: 'AE',
       link: function($scope, iElm, iAttrs, ngModel) {
         if(!ngModel) return;
         ngModel.$parsers.push(function(viewValue){
           var num = parseInt(viewValue);
           if(num>=0 && num<99){
             ngModel.$setValidity('test',true);
             return viewValue;
           }else{
             ngModel.$setValidity('test',false);
             return undefined;
           }
         });
       }
     };
   });
 </script>

AngularJs-$parsers自我理解-解析的更多相关文章

  1. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  2. 摘:Windows系统内存计数器理解解析_备忘录_51Testing软件测试网...

    [原创]Windows系统内存计数器理解解析 2008-05-13 11:42:23 / 个人分类:性能测试 说明:本文的计数器以Windows2003为准. 序言;F9n)\%V1a6Z C)?ZV ...

  3. mysql的索引、视图、存储过程(自我理解总结)

    一.索引 索引在MySQL中也叫'键'或者'key',是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要,减少IO次数,加 ...

  4. 关于C#的委托(delegate)的自我理解

    首先描述一个事情,一个老师饿了,他要去买东西填饱肚子,然后他发现他的学生“小李”在玩,没学习,于是就委托“小李”去帮他买吃的. 根据这件事我们来分析: 首先得有个老师(老师饿了是他的方法,老师买东西也 ...

  5. android 的生命周期自我理解

    android的active的生命周期,经过网站的blog学习,加上自己的理解总结如下: 第1种:全新的启动应用程序顺序 onCreate--->onStart---->onResume ...

  6. Java内部类的自我理解

    本文借鉴网络上多位大牛的博客和文章.感谢各位不知名人士的分享. 一.什么事内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的成员,而且依附于外部类而存在的.内部类能够为静态,可用p ...

  7. java 线程 理解 解析

    1 线程的概述 进程:正在运行的程序,负责了这个程序的内存分配,代表了内存中的执行区域. 线程:就是在一个进程中负者一个执行路径. 多线程:就是在一个进程中多个执行路径同时执行. 假象: 电脑上的程序 ...

  8. 关于 String 自我理解

    String 的一些认识: String对象是不可变,所以使用 final 修饰 字符串拼接,合理利用 StringBuilder(线程非安全),StringBuffer 线程安全 常用方法就不详细介 ...

  9. AC自动机自我理解和模板

    给出长度为m的文本 查询 n个单词出现的次数 用kmp 复杂度 n*m*(单词平均长度) 用字典树 复杂度 m*每次字典树遍历的平均深度) AC自动机 复杂度 m (思路可以理解为kmp+字典树 ) ...

随机推荐

  1. eclipse中设置项目的编码方式

    1.windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右侧Text file encoding ...

  2. pip virtualenv requirement

    原文:https://blog.csdn.net/u011860731/article/details/46561513 pip可以很方便的安装.卸载和管理Python的包.virtualenv则可以 ...

  3. PAT甲题题解-1033. To Fill or Not to Fill (25)-模拟

    模拟先说一下例子,最后为方便起见,在目的地安增加一个费用为0的加油站0 1 2 3 4 5 6 7 87.1 7.0 7.2 6.85 7.5 7.0 7.3 6.0 00 150 200 300 4 ...

  4. github优缺点

    以前bitbucket沒有支援git github可以直接在網站上瀏覽push的圖片 github 可以針對code行數直接留言與回覆 github Markdown支援很好 github 的issu ...

  5. ElasticSearch 2 (3) - Breaking Changes

    ElasticSearch 2.1.1 (3) - Breaking Changes Search Changes search_type = scan Deprecated GET /my_ind ...

  6. JS 一些问题与解决方法

    一.post/get传输json数据中包含特殊字符 在使用HTTP请求传输数据时,因为他本身也需要一些字符做标记,比如= &,所以传输的数据中如果有特殊字符,就会被错误的理解成标记字符做了一些 ...

  7. css3新增的伪类和伪元素

    E:target事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口 E:disabled表示不可点击的表单控件 E:enabled表示可点击的表单控件 E:checked表 ...

  8. 11th 如果重新来过

    如果重新来过,我想我不会再因任何阻碍而选择中途放弃了.为了追求完美,结果做不到自己想要的程度,就备感挫败感,于是乎就求全责备,无法继续进行下去,即便你一直原地踏步,其实也就相当于是放弃了,跟不做没有什 ...

  9. 二叉树的Java实现及特点总结

    二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...

  10. 特殊符号 UNICODE编码

    特殊符号 UNICODE编码 =================== Start ⇠  箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ & ...