AngularJS directive指令之require部分
2016-05-10 17:18
666 查看
这部分提到了angularjs的$parsers相关知识,可以参考:
require参数可以被设置为字符串或数组,字符串代表另外一个指令的名字。require会将控制器注入到其值所指定的指令中,并作为当前指令的链接函数的第四个参数。
字符串或数组元素的值是会在当前指令的作用域中使用的指令名称。
scope会影响指令作用域的指向,是一个隔离作用域,一个有依赖的作用域或者完全没有作用域。在任何情况下,AngularJS编译器在查找子控制器时都会参考当前指令的模板。
如果不使用^前缀,指令只会在自身的元素上查找控制器。
require参数的值可以用下面的前缀进行修饰,这会改变查找控制器时的行为:
?
如果在当前指令中没有找到所需要的控制器,会将null作为传给link函数的第四个参数。
^
如果添加了^前缀,指令会在上游的指令链中查找require参数所指定的控制器。
?^
将前面两个选项的行为组合起来,我们可选择地加载需要的指令并在父指令链中进行查找。
没有前缀
如果没有前缀,指令将会在自身所提供的控制器中进行查找,如果没有找到任何控制器(或具有指定名字的指令)就抛出一个错误。
用通俗的话说require字段,作用是用于指令之间的相互交流。
在Angular默认指令时,与自定义Angular指令原理是一样的,例如ngmodel,我的理解为smartFloat指令需要用到ngmodel指令中对length值的控制。
下面这段代码功能是:把"1.2"或者"1,2"都转化为合法的浮点数"1.2"。
在自定义Angular指令时。
举个简单的例子,假如我们现在需要编写两个指令,在linking函数中有很多重合的方法,为了避免重复,我们可以将这个重复的方法写在第三个指令的 controller中,然后在另外两个需要的指令中require这个拥有controller字段的指令,最后通过linking函数的第四个参数就可以引用这些重合的方法。
参考了网上大神的资料:
http://hudeyong926.iteye.com/blog/2074238
require参数可以被设置为字符串或数组,字符串代表另外一个指令的名字。require会将控制器注入到其值所指定的指令中,并作为当前指令的链接函数的第四个参数。
字符串或数组元素的值是会在当前指令的作用域中使用的指令名称。
scope会影响指令作用域的指向,是一个隔离作用域,一个有依赖的作用域或者完全没有作用域。在任何情况下,AngularJS编译器在查找子控制器时都会参考当前指令的模板。
如果不使用^前缀,指令只会在自身的元素上查找控制器。
//... restrict: 'EA', require: 'ngModel' //...指令定义只会查找定义在指令作当前用域中的ng-model=""。
<!-- 指令会在本地作用域查找ng-model --> <div my-directive ng-model="object"></div>
require参数的值可以用下面的前缀进行修饰,这会改变查找控制器时的行为:
?
如果在当前指令中没有找到所需要的控制器,会将null作为传给link函数的第四个参数。
^
如果添加了^前缀,指令会在上游的指令链中查找require参数所指定的控制器。
?^
将前面两个选项的行为组合起来,我们可选择地加载需要的指令并在父指令链中进行查找。
没有前缀
如果没有前缀,指令将会在自身所提供的控制器中进行查找,如果没有找到任何控制器(或具有指定名字的指令)就抛出一个错误。
用通俗的话说require字段,作用是用于指令之间的相互交流。
在Angular默认指令时,与自定义Angular指令原理是一样的,例如ngmodel,我的理解为smartFloat指令需要用到ngmodel指令中对length值的控制。
下面这段代码功能是:把"1.2"或者"1,2"都转化为合法的浮点数"1.2"。
app.directive('smartFloat', function() { return { require: 'ngModel', link: function(scope, elm, attrs, ctrl) { ctrl.$parsers.unshift(function(viewValue) { if (FLOAT_REGEXP.test(viewValue)) { ctrl.$setValidity('float', true); return parseFloat(viewValue.replace(',', '.')); } else { ctrl.$setValidity('float', false); return undefined; } }); } }; });
<input type="text" ng-model="length" name="length" smart-float /> {{length}}<br /> <span ng-show="form.length.$error.float">This is not a valid float number!</span>
在自定义Angular指令时。
举个简单的例子,假如我们现在需要编写两个指令,在linking函数中有很多重合的方法,为了避免重复,我们可以将这个重复的方法写在第三个指令的 controller中,然后在另外两个需要的指令中require这个拥有controller字段的指令,最后通过linking函数的第四个参数就可以引用这些重合的方法。
var app = angular.modeule('myapp',[]); app.directive('common',function(){ return { ... controller: function($scope){ this.method1 = function(){ }; this.method2 = function(){ }; }, ... } }); app.directive('d1',function(){ return { ... require: '?^common', link: function(scope,elem,attrs,common){ scope.method1 = common.method1; .. }, ... } });
参考了网上大神的资料:
http://hudeyong926.iteye.com/blog/2074238
相关文章推荐
- Angularjs实现分页和分页算法
- angular controller不执行
- webstorm查看angular2的ts源码
- Eclipse上安装angularjs插件
- 25个超有用的 AngularJS Web 开发工具
- AngularJS 的表单验证
- Angularjs中的ng-class
- AngularJs多重视图和路由的使用
- 如何使用 AngularJS 的 ngShow 和 ngHide
- Angularjs Directive(指令)机制
- Angularjs循环二维数组
- AngularJs: Reload page
- 创建 AngularJS 自定义过滤器,带自定义参数
- angularjs三级联动
- angularjs中动态为audio绑定src
- angularjs ng-switch
- 理解 angular2 基础概念和结构 ----angular2系列(二)
- [Angular 2] @ngrx/devtools demo
- 被angular的错误提示吓到了
- AngularJS学习笔记(一):表达式&指令&作用域