$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. RPG游戏开发基础教程

    RPG游戏开发基础教程 第一步 下载RPG Maker 开发工具包 1.RPG Maker 是什么? RPG Maker 是由Enterbrain公司推出的RPG制作工具. 中文译名为RPG制作大师. ...

  2. Verilog HDL数组(存储器)操作

    本文从本人的163博客搬迁至此. 引用了http://blog.sina.com.cn/s/blog_9424755f0101rhrh.html Verilog HDL中常采用数组方式来对存储器进行建 ...

  3. Final发布 视频展示

    1.视频链接 视频地址:http://v.youku.com/v_show/id_XMzk1OTYyNjE0NA==.html?spm=a2hzp.8244740.0.0 杨老师粉丝群——弹球学成语项 ...

  4. Linux内核分析——第二周学习笔记20135308

    第二周 操作系统是如何工作的 第一节 函数调用堆栈 存储程序计算机:是所有计算机基础的框架 堆栈:计算机中基础的部分,在计算机只有机器语言.汇编语言时,就有了堆栈.堆栈机制是高级语言可以运行的基础. ...

  5. Beta版本总结

    beta 阶段的 postmortem 报告 1. 每个成员在beta 阶段的实践和alpha 阶段有何改进? 成员  Beta阶段的实践和alpha 阶段有何改进  黄山成 beta阶段较alpha ...

  6. 小学四则运算APP 第一个冲刺阶段 第三天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布是在与团队成员解决了昨天问题的基础上,再增加了几个界面,增加了一些功能,修改与增加的代 ...

  7. 新版 Chrome Ajax 跨域调试

    一.前言 web 开发中 Ajax 是十分常见的技术,但是在前后端使用接口对接的调试过程中不可避免会碰到跨域问题.今天我给大家介绍一个十分简单有效的方法. 跨域经典错误 二.Chrome 跨域设置 首 ...

  8. MySql_创建用户并赋予权限

    MySql两种创建用户方式 win+r cmd C:\Users\Administrator>mysql -uroot -proot # 方式一 mysql> insert into my ...

  9. 在Docker环境下部署高可用的Eureka注册中心

    Eureka Server的同步遵循着一个非常简单的原则,只要有一条边将节点连接,就可以进行信息传播和同步 由于Eureka Server进行相互注册的方式来实现高可用的部署,所以我们只需要将Eure ...

  10. gitlab迁移

    1.背景: 操作系统:CentOS Linux release (Core) gitlab版本: 使用rpm包地址:https://mirrors.tuna.tsinghua.edu.cn/gitla ...