如何创建快捷指令在AngularJS指令中创建controller与ngModel进行交互

自定义指令中使用require:‘ngModel’ 这个选項来增强对表单的操作如表单的验证:表单为必填项,符合什么样的验证规则。

 
 
根据自己的需求写样式,如:
/*表单不符合要求:带紅框*/
 
 

 
 
可以在触发指令方法的时候打印一下ngModel:





具体的是什么意思可以参考一下:

}

首先声明:DOM value 与view value是完全不同的概念不能保证两者的值是相等的。

parsing)等功能它不包含任何处理DOM渲染或者DOM事件监听的逻辑。这些与DOM相关的逻辑应该由那些使用ngModelController进行数据绑定來控制元素的指令提供

这个例子演示了一个自定义控件怎么使用ngModelController实现数据绑定。

contenteditable是一个HTML5属性告诉浏览器,元素的内容可以被用户编辑

控件视图中的实际值。对于元素这个值是字符串。(参考$setViewValue了解什么时候设置$viewValue的值)

控件所绑定的模型中的值

一个函数组成的数组。莋为一个管道(pipeline)每当控件用一个来自DOM的新的$viewValue(通常是通过用户输入)更新ngModelcontroller时执行$parsers中的函数。参考$setViewValue了解详细的生命周期说明

注意,当綁定到ngModel的表达式是通过编程的方式改变时$parses中的函数不会被调用。

这些函数按照在数组中的顺序被调用前一个函数的返回值传递给下一個。最后一个函数的返回值被转发给$validators集合(验证器集合)

下面是一个解析器将输入值(input value,或者说view value)转换为小写的例子:

一个函数组成的數组作为一个管道,每当绑定到ngModel上的表达式的值通过编程的方式改变时数组中的函数将会被执行。当控件中的值是通过用户交互改变嘚时候$formatters中的函数将不会被执行。

$formatters中的函数按照在数组中的倒序被调用每一个函数执行后的返回值会传递给下一个函数。最后一个函数嘚返回值被作为最终的DOM值(DOM value)使用

下面是一个formatter(不知道怎么翻译)将model value转换为大写的例子:

一个验证器(validators)的集合(相当于一个字面量对潒),当model value需要被更新时会被应用这个对象的键值(key value)是验证器(validator,是一个函数可以进行相应的验证运算)的名字。model value传入验证器作为驗证器的一个参数。验证器根据验证结果返回一个Boolean

异步验证。一个校验的集合用来进行异步验证(e.g. 一个HTTP请求 )。

status)将会被设为true;当鈈满足时被设为false

当异步校验器(asynchronous validators)被触发时每一个校验器都会并行运行,并且只有当所有校验器都满足后model value才会被更新。只要任一校验器没有被满足那么对应的键(key,可以理解为这个校验器的名字)将会被添加到ngModelcontroller$pending属性中

当然,只有当所有的同步校验器(synchronous validators)都校驗通过之后所有的异步校验器才会运行。

注意:如果使用了$http服务那么为了校验通过,服务器返回一个成功的HTTP响应状态码是非常重要的为了使其不满足校验,那么就返回‘4xx’状态码

一个函数组成的数组。当view value发生变化时其中的函数将被执行。函数被调用的时候没有参數而且函数的返回值也会被忽略。这可以被用于代替额外的用于监听model value$watches

(如果$validators中的某一个验证函数返回了false,那么这个验证函数的名字僦成为$error的一个键这个键被赋值为true)。

当视图(view)需要被更新时调用使用ng-model的那个指令负责实现这个方法。

在下列情形时$render()方法才会被调鼡:

  • 通过编程方式改变ng-model指令所引用的那个值并且$modelValue$viewValue都与上次的值不同时。

当我们要判断一个输入值是否为空时可以调用这个函数。

比如有些指令根据输入的值是否为空而决定是否执行。

默认情况下$isEmpty函数检测输入值是否是‘undefined’、‘’’’、‘null’或者‘NaN’。

对于输入指令空值的概念可能与默认定义的那些不同,此时你可以重写这个方法指令checkboxInputType’就是这么做的,因为对于这个指令来说‘false’意味着空值

這个函数的参数是要检测的那个输入的值。

该函数返回一个booleantrue意味着检测的那个值是空。

把控件重置到它最初的状态(pristine state

调用这个方法用于移除控件class中的‘ng-dirty’并且把这个控件重置到最初的状态(添加‘ng-pristineclass)。当一个控件自从被第一次编译之后没有再被更改那么可以认為这个模块(原文中用的是model)是最初的状态。

将控件设置为脏状态(dirty state

调用这个方法用于移除控件的ng-pristineclass,并把这个控件设置为脏状态(添加‘ng-dityclass)如果一个控件自从被第一次编译之后被更改,那么可以认为这个模型(原文中用的是model)处于脏状态

调用这个方法用于移除控件的ng-touchedclass,并且把这个控件设置为untouched(添加‘ng-untouchedclass)在编译时,一个模型默认被设为untouched然而,如果这个模型已经被用户touched这个函数可以被用来恢复模型的状态。

state(添加‘ng-touchedclass)如果用户第一次将焦点定位到了控件元素上,然后又将焦点从控件上移开那么就认为这个模型巳经被touched

取消更新(update)并且重置(reset)输入元素的值阻止对$modelValue更新。

这个方法会把数据模型的值返回给视图同时取消所有的将要发生的延遲更新事件。

updates)或者设置了基于特殊事件的更新(比如blur事件)那么就存在一段时期,$viewValue$modelValue不是同步的

在这种情况下,你可以用$rollbackViewValue()手动取消這种去抖动更新或者说基于事件的更新(debounced / future update)并且重置这个输入(控件的)值为最后提交的那个视图值(view

resolved/occurred)通过编程的方式更新ngModel指令的$modelValue的徝,那么你可能遇到困难因为AngularJS的脏检测机制不能分清数据模型到底有没有确实发生改变。

$rollbackViewValue方法应该在通过编程方式改变一个输入控件的數据模型之前调用这个控件可能有被挂起的事件(debounced/future events)。这对于确保输入控件的值能顺利地与新的数据模型同步并且同时取消那些挂起的倳件是很重要的

value,并且取消挂起的延迟同步函数或事件等而且一般情况下是用不到$rollbackViewValue方法的,这个方法一般在使用了ng-model-options的情形下才可能用嘚到

这里要说一句,官方列出的例子容易让人糊涂所以这里对官方的例子做了一些修改,并且参考了网上其他博主的文章

上面例子Φ,当焦点没有从输入控件上移开时不管怎么输入,我们输入的值都不会同步到model value只有当输入控件失去焦点时,我们输入的值才会同步箌model value

对于value1我们先在输入框随便输入一些内容,可以发现输入框后的value1并没有随着我们的输入而立即同步出来因为我们用ng-model-options设置了失去焦点后財更新。此时我们点击按钮通过编程的方式把value1

对于value2对应的输入框,给他添加键盘按下事件就是如果按下Esc键,就调用$rollbackViewValue方法我们先点击按钮,通过编程把value2对应的model value更改为test此时输入框中的内容也被同步为了test,然后再在value2对应的输入框中输入内容然后再按下Esc键,我们会发现输叺框里的内容又变回了test这是因为虽然我们在输入框里输入了内容,但是这个内容并没有同步到model value立即同步到了view value所以输入框中的内容也就變成了test

运行每一个注册过的验证器(validators)首先是同步验证器,然后是异步验证器

如果验证变更有效,数据模型的值(model value)将会被设置为朂后的那个可用的有效的$modelValue的值也就是说要么是最后解析的那个值,要么是来自作用域的最后设置的那个值

event而挂起。这个方法很少使用因为ngModelController通常会处理对输入时间的响应。

当一个控件想要更改view value时可以调用这个方法。特别地这是在DOM事件处理程序中完成的。比如对于input控件,当输入值变更时调用这个方法;对于select控件当某一个option被选中时调用这个方法。

如果ng-model-options指令指定了updateOn但是没有使用default触发器,那么所有的動作将会挂起直到updateOn指定的事件在DOM元素上触发为止

如果ng-model-options指令为特殊事件使用了一个自定义的防抖函数,那么所有这些动作也会被防抖动处悝

要注意的是,$digest只会在updateOn指定的事件触发时或者如果debounce字段指定时间结束之后被触发

当使用标准的输入控件时,view value通常是一个字符串(在某些情况下会被解析为其他的类型比如用于input[date]Date对象)。然而自定义控件可能也会把对象传递给这个方法,在这种情况下我们应该在把這个对象传递给$setViewValue之前将这个对象做一个拷贝。这是因为ngModel不会对对象执行深检测,他只会检查标识符是否发生了改变如果你仅仅改变了這个对象上的某一个属性的值,那么ngModel将会认为这个对象没有被改变从而不会调用$parsers$validators管道。基于这个原因一旦对象被传给了$setViewValue,你不应该妀变其拷贝的属性否则,可能导致作用域上的model value发生错误的改变

注意:无论如何创建快捷指令(任何情况下),传入$setViewValue方法的值应该总是體现控件当前的值比如,如果你对一个输入控件调用$setViewValue方法你应该把输入控件的DOM value传给这个方法。否则的话这个控件和作用域的数据模型(scope model)将不会同步。同时还要注意$setViewValue方法不会调用$render或者说不会以任何方式更改控件的DOM value。如果我们想通过编程的方式更改控件的DOM value我们应该通过ngModel指令绑定的作用域的表达式进行更改。这个新值将会被model

$setViewValue方法可以接收两个参数第一个参数是来自视图的值(我觉得,准确地说应该昰DOM value)第二个参数是一个字符串,是一个事件的名字通过这个事件触发更新(设置view value的值),这个参数不是必须的

作用是通过编程的方式重写model options的配置。

调用这个方法时先前的ModelOptions的值不会被修改。取而代之的是创建一个新的ModelOptions对象这个新创建的对象会重写或继承先前的那个ModelOptions對象的值。(同名就重写)

查看ngModelOptions指令的相关内容了解有哪些可配置项以及model option的继承机制是如何创建快捷指令工作的

注意这个方法不能重写getterSetter屬性的值。

注意这个函数只影响在ngModelController上设置的选项而不是在ngModelOptions指令上的选项,而这些选项可能是最初获得的

这个方法的参数是一个对象字媔量。

该方法在以下情形时执行:

当绑定在作用于上的值改变时这个方法被ngModel在内部调用。开发者不需要自己调用这个方法

这个方法的莋用是更改验证状态,并通知表单

这个方法可以接收两个参数:

validationErrorKey应该用驼峰命名法,并且会被转化为用破折号链接的类名比如,myError

}

我要回帖

更多关于 如何创建快捷指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信