AngularJs 指令directive之require

controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编 写,使用起来比较简单;另一种方法则是require AngularJS内建的指令,其中大部分时间需要require的都是ngModel这个指令。

在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流。举个简单的例子,假如我们现在需要编写两 个指令,在linking函数中有很多重合的方法,为了避免重复自己(著名的DRY原则),我们可以将这个重复的方法写在第三个指令的 controller中,然后在另外两个需要的指令中require这个拥有controller字段的指令,最后通过linking函数的第四个参数就可以引用这些重合的方法。代码的结构大致如下:

Java代码  

  1. var app = angular.modeule(‘myapp‘,[]);
  2. app.directive(‘common‘,function(){
  3. return {
  4. ...
  5. controller: function($scope){
  6. this.method1 = function(){
  7. };
  8. this.method2 = function(){
  9. };
  10. },
  11. ...
  12. }
  13. });
  14. app.directive(‘d1‘,function(){
  15. return {
  16. ...
  17. require: ‘?^common‘,
  18. link: function(scope,elem,attrs,common){
  19. scope.method1 = common.method1;
  20. ..
  21. },
  22. ...
  23. }
  24. });

当然,上面例子只是指令中controller用法的一种。虽然一般来说,使用controller字段的机会不是很多,但是想要写好AngularJS的指令,这是必须要掌握的一点。

引用内置指令

Java代码  

  1. angular.module(‘myApp‘)
  2. .directive(‘spoint‘, function() {
  3. return {
  4. require: ‘ngModel‘,
  5. link: function(scope, elm, attrs, ctrl) {
  6. var fibonacci = [1, 2, 3, 5, 8, 13, 20, 40, 80];
  7. ctrl.$parsers.unshift(function(viewValue) {
  8. if (fibonacci.indexOf(parseInt(viewValue)) >= 0) {
  9. ctrl.$setValidity(‘fibonacci‘, true);
  10. return viewValue;
  11. } else {
  12. ctrl.$setValidity(‘fibonacci‘, false);
  13. return undefined;
  14. }
  15. });
  16. }
  17. };
  18. });

这里值得注意的是directive里link方法的第四个参数,我们在require里定义了ngModel 所以这里它是一个NgModelController

NgModelController是用来为ng-model提供了一组API。通过他我们可以他来确定ngModel的 值是否是合法的。 我们这里只介绍其中和表单验证有关的几个方法和属性。

上面的例子中我们用到了$parsers这个属性和$setValidity()这个方法。 $parsers里保存了一组function, 每当DOM里数据变化的时候, 这组function会被一次调用。这里给了我们机会在用户修改了DOM里值的时候, 去对新输入的值做校验。

“智能浮点(smart-float)”指令。它能把"1.2"或者"1,2"都转化为合法的浮点数"1.2"。注意,这里我们不能使用“数字输入类型”,因为HTML5的浏览器不允许用户输入像"1,2"这样的非法值。

html

Java代码  

  1. <input type="text" ng-model="length" name="length" smart-float />
  2. {{length}}<br />
  3. <span ng-show="form.length.$error.float">This is not a valid float number!</span>

js

Java代码  

  1. var FLOAT_REGEXP = /^\-?\d+((\.|\,)\d+)?$/;
  2. app.directive(‘smartFloat‘, function() {
  3. return {
  4. require: ‘ngModel‘,
  5. link: function(scope, elm, attrs, ctrl) {
  6. ctrl.$parsers.unshift(function(viewValue) {
  7. if (FLOAT_REGEXP.test(viewValue)) {
  8. ctrl.$setValidity(‘float‘, true);
  9. return parseFloat(viewValue.replace(‘,‘, ‘.‘));
  10. } else {
  11. ctrl.$setValidity(‘float‘, false);
  12. return undefined;
  13. }
  14. });
  15. }
  16. };
  17. });
时间: 2024-08-07 20:44:57

AngularJs 指令directive之require的相关文章

【转载】AngularJs 指令directive之controller,link,compile

关于自定义指令的命名,你可以随便怎么起名字都行,官方是推荐用[命名空间-指令名称]这样的方式,像ng-controller.不过你可千万不要用 ng-前缀了,防止与系统自带的指令重名.另外一个需知道的地方,指令命名时用驼峰规则,使用时用-分割各单词.如:定义myDirective,使用时 像这样:<my-directive>. 这里列出directive的合法命名: ng:bind ng-bind ng_bind x-ng-bind data-ng-bind 我是教师,在新建试题输入分数的时候

【angularJS】Directive指令

AngularJS 通过被称为 指令 的新属性来扩展 HTML.指令是扩展的 HTML 属性,带有前缀 ng-. 内置指令 1.ng-app 指令初始化一个 AngularJS 应用程序. 定义了 AngularJS 应用程序的 根元素. 2.ng-init 指令初始化应用程序数据. 通常情况下,不使用 ng-init.您将使用一个控制器或模块来代替它. 3.ng-model 指令把元素值(比如输入域的值)绑定到应用程序[一般是在控制器中定义的变量]. 4.ng-repeat 指令会重复一个 H

angularjs 一篇文章看懂自定义指令directive

 壹 ? 引 在angularjs开发中,指令的使用是无处无在的,我们习惯使用指令来拓展HTML:那么如何理解指令呢,你可以把它理解成在DOM元素上运行的函数,它可以帮助我们拓展DOM元素的功能.比如最常用ng-click可以让一个元素能监听click事件,这里你可能就有疑问了,同样都是监听为什么不直接使用click事件呢,angular提供的事件指令与传统指令有什么区别?我们来看一个例子: <body ng-controller="myCtrl as vm"> <d

AngularJS之基础-5 路由(定义路由、使用路由)、自定义指令(Directive)

一.定义路由 ng-view - AngularJS 支持通过在单页面上的多个视图的单页应用 - ng-view 标记只是简单地创建一个占位符 - 使用 ng-template - 创建使用script标签的HTML视图 - 使用 - 定义类型作为主模块中 ng-template 的脚本块 $routeProvider - 映射相应的HTML页面或ng-template - 附加一个控制器使用相同键的服务   - 注意: - 需要angular-route.js脚本文件的引用 二.使用路由 锚点

Angular之指令Directive系列

项目筹备近期开启Angular学习,指令比较难理解所以记录备案,推荐视频大漠穷秋 Angular实战 由于篇幅过长,列举大纲如下: 一.指令directive概述 指令可以对元素绑定事件监听或者改变DOM结构而使HTML拥有像jQuery一样效果具有交互性.不同于jQuery,Angular设计核心思想是通过数据与模板的绑定,摆脱繁琐的DOM操作,而将注意力集中在业务逻辑上. 几种常见指令ng-app 指令用来指定ng的作用域是在那个标签以内部分(<html ng-app="myApp&q

angularJS 指令二

指令详解1.用directive()方法来定义指令.directive('myDirective',function($timeout,userDefinedService){ return {};});该方法接受两个参数:name(字符串):指令的名字,用来在视图中引用特定的指令factory_function(函数):该函数返回一个对象,其中定义了指令的全部行为当AngularJS启动应用时,会把第一个参数当做一个字符串,并以此字符串为名来来注册第二个参数返回的对象.也可以返回一个函数代替对

angularJS中directive与directive 之间的通信

上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被父directive替换覆盖:及当子directive需要用到父directive中controller某个变量或者方法的时候 怎么实现两个directive之间的通信的. 这里主要讲directive的两个属性: 1.transclude 2.require html 1 <!DOCTYPE ht

AngularJs指令(一)

AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋.最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用,一直都是学了就忘记了),也写写复习的知识点,希望这次能让我对AngularJs的理解更深入透彻. 知识概要 一.什么是指令Directive 二.指令的编译过程及命名方式 二.AngularJS自定义指令的配置参数 二.AngularJS的内置指令有哪些 什么是指令Directive Angula

angularJs指令深度分析

AngularJs的指令定义大致如下 angular.module("app",[]).directive("directiveName",function(){ return{ //通过设置项来定义 }; })其中return返回的对象包含很多参数,下面一一说明 你知道用AngularJs怎么定义指令吗? 1.restrict (字符串)可选参数,指明指令在DOM里面以什么形式被声明: 取值有:E(元素),A(属性),C(类),M(注释),其中默认值为A: E(元