导读跟大家讲解下有关深入浅析Angular中Directive的用法,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说深入浅析Angular中D
跟大家讲解下有关深入浅析Angular中Directive的用法,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说深入浅析Angular中Directive的用法,小编也收集到了有关深入浅析Angular中Directive的用法的相关资料,希望大家看到了会喜欢。
本篇文章给大家详细介绍一下Angular Directive,了解它的用法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
Directive可能是AngularJS中比较复杂的一个东西了。一般我们将其理解成指令。AngularJS自带了不少预设的指令,比如ng-app,ng-controller这些。可以发现个特点,AngularJS自带的指令都是由ng-打头的。
那么,Directive究竟是个怎么样的一个东西呢?我个人的理解是这样的:将一段html、js封装在一起,形成一个可复用的独立个体,具体特定的功能。下面我们来详细解读一下Directive的一般性用法。
var myDirective = angular.module('directives', []);myDirective.directive('directiveName', function($inject) { return { template: '<div></div>', replace: fal, transclude: true, restrict: 'E', scope: {}, controller: function($scope, $element) { }, complie: function(tElement, tAttrs, transclude) { return { pre: function preLink(scope, iElement, iAttrs, controller) { }, post: function postLink(scope, iElement, iAttrs, controller) { } }; }, link: function(scope, iElement, iAttrs) { } };});这里直接return了一个object,对象中包括比较多的属性,这些属性都是对自定义directive的定义。详细的含义,下面会继续说明。return对象参数说明
return { name: '', priority: 0, terminal: true, scope: {}, controller: fn, require: fn, restrict: '', template: '', templateUrl: '', replace: '', transclude: true, compile: fn, link: fn}
相关教程推荐:《angular教程》
如上所示,return的对象中会有很多的属性,这行属性都是用来定义directive的。
name
priority
teminal
scope
true
将为这个directive创建一个新的scope。如果在同一个元素中有多个directive需要新的scope的话,它还是只会创建一个scope。新的作用域规则不适用于根模版,因为根模版往往会获得一个新的scope。{}
将创建一个新的、独立的scope,此scope与一般的scope的区别在于它不是通过原型继承于父scope的。这对于创建可复用的组件是很有帮助的,可以有效的防止读取或者修改父级scope的数据。这个独立的scope会创建一个拥有一组来源于父scope的本地scope属性hash集合。这些本地scope属性对于模版创建值的别名很有帮助。本地的定义是对其来源的一组本地scope property的hash映射。controller
require
restrict
template
templateUrl
replace
transclude
true/fal
转换这个directive的内容。(这个感觉上,是直接将内容编译后搬入指定地方)‘element’
转换整个元素,包括其他优先级较低的directive。(像将整体内容编译后,当作一个整体(外面再包裹p),插入到指定地方)compile
link
这里关于directive的scope为一个object时,有更多的内容非常有必要说明一下。看下面的代码:
scope: { name: '=', age: '=', x: '@', say: '&'}
html这个scope中关于各种属性的配置出现了一些奇怪的前缀符号,有=,@,&,那么这些符号具体的含义是什么呢?再看下面的代码:
<div my-directive name="myName" age="myAge" x="male" say="say()"></div>复制代码javascript
function Controller($scope) { $scope.name = 'Pajjket'; $scope.age = 99; $scope.x = '我是男的'; $scope.say = function() { alert('Hello,我是弹出消息'); };}
=
: 指令中的属性取值为Controller中对应$scope上属性的取值@
: 指令中的取值为html中的字面量/直接量&
: 指令中的取值为Controller中对应$scope上的属性,但是这个属性必须为一个函数回调下面是更加官方的解释:=
或者=expression/attr
例如:中,widget定义的scope为:{localModel: ‘=myAttr’},那么widget scope property中的localName将会映射父scope的parentModel。如果parentModel发生任何改变,localModel也会发生改变,反之亦然。即双向绑定。
@[emailprotected] scope property到DOM属性的绑定。因为属性值总是String类型,[emailprotected]指定属性名称,那么本地名称将与DOM属性的名称一致。例如:,widget的scope定义为:{localName: ‘@myAttr’}。那么,widget scope property的localName会映射出”hello “转换后的真实值。当name属性值发生改变后,widget scope的localName属性也会相应的改变(仅仅是单向,与上面的=不同)。那么属性是在父scope读取的(不是从组件的scope读取的)
&或者&attr提供一个在父scope上下文中执行一个表达式的途径。如果没有指定attr的名称,那么local name将与属性名一致。
例如:<widget my-attr="count = count + value">
,widget的scope定义为:{localFn:’increment()’},那么isolate scope property localFn会指向一个包裹着increment()表达式的function。一般来说,我们希望通过一个表达式,将数据从isolate scope传到parent scope中。这可以通过传送一个本地变量键值的映射到表达式的wrapper函数中来完成。例如,如果表达式是increment(amount),那么我们可以通过localFn({amount:22})的方式调用localFn以指定amount的值。
下面的示例都围绕着上面所作的参数说明而展开的。
directive声明实例// 自定义directivevar myDirective = angular.modeule('directives', []);myDirective.directive('myTest', function() { return { restrict: 'EMAC', require: '^ngModel', scope: { ngModel: '=' }, template: '<div><h4>Weather for {{ngModel}}</h4</div>' };});// 定义controllervar myControllers = angular.module('controllers', []);myControllers.controller('testController', [ '$scope', function($scope) { $scope.name = 'this is directive1'; }]);var app = angular.module('testApp', [ 'directives', 'controllers']);<body ng-app="testApp"> <div ng-controller="testController"> <input type="text" ng-model="city" placeholder="Enter a city" /> <my-test ng-model="city" ></my-test> <span my-test="exp" ng-model="city"></span> <span ng-model="city"></span> </div></body>
templateUrl其实根template功能是一样的,只不过templateUrl加载一个html文件,上例中,我们也能发现问题,template后面根的是html的标签,如果标签很多呢,那就比较不爽了。可以将上例中的,template改一下。
myDirective.directive('myTest', function() { return { restrict: 'EMAC', require: '^ngModel', scope: { ngModel: '=' }, templateUrl:'../partials/tem1.html' //tem1.html中的内容就是上例中template的内容。 }});
//directives.js中定义myAttrmyDirectives.directive('myAttr', function() { return { restrict: 'E', scope: { customerInfo: '=info' }, template: 'Name: {{customerInfo.name}} Address: {{customerInfo.address}}<br>' + 'Name: {{vojta.name}} Address: {{vojta.address}}' };});//controller.js中定义attrtestmyControllers.controller('attrtest',['$scope', function($scope) { $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' }; $scope.vojta = { name: 'Vojta', address: '3456 Somewhere El' }; }]);// html中<body ng-app="testApp"> <div ng-controller="attrtest"> <my-attr info="naomi"></my-attr> </div></body>
Name: Naomi Address: 1600 Amphitheatre //有值,因为customerInfo定义过的Name: Address: //没值 ,因为scope重定义后,vojta是没有定义的
myDirectives.directive('myAttr', function() { return { restrict: 'E', template: 'Name: {{customerInfo.name}} Address: {{customerInfo.address}}<br>' + 'Name: {{vojta.name}} 社团申请书Address: {{vojta.address}}' };});运行结果如下:
Name: Address:Name积累素材: Vojta Address: 3456 Somewhere El
因为此时的directive没有定义独立的scope,customerInfo是undefined,所以结果正好与上面相反。
myDirective.directive('myEvent', function() { return { restrict: 'E', transclude: true, scope: { 'clo': '$onClick' /与其抱怨不如改变/根html中的on-click="hideDialog()"有关联关系 北京有什么好玩的地方}, templateUrl: '../partials/event_part.html' };});myController.controller('eventTest', [ '$scope', '$timeout', function($scope, $timeout) { $scope.name = 'Tobias'; $scope.hideDialog = function() { $scope.dialogIsHidden = true; $timeout(function() { $scope.dialogIsHidden = fal; }, 2000); }; }]);
<body ng-app="phonecatApp"> <div ng-controller="eventtest"> <my-event ng-hide="dialogIsHidden" on-click="hideDialog()"> Check out the contents, {{name}}! </my-event> </div></body><!--event_part.html --><div> <a href ng-click="clo()">×</a> <div ng-transclude></div></div>说明:这段html最终的结构应该如下所示:
<body ng-app="phonecatApp"> <div ng-controller="eventtest"> <div ng-hide="dialogIsHidden" on-click="hideDialog()"> <span>Check out the contents, {{name}}!</span> </div> </div></body>将原来的html元素中的元素Check out the contents, !插入到模版的中,还会另外附加一个标签。
controller
,link
,compile
之间的关系myDirective.directive('exampleDirective', function() { return { restrict: 'E', template: '<p>Hello {{number}}!</p>', controller: function($scope, $element){ $scope.number = $scope.number + "22222 "; }, link: function(scope, el, attr) { scope.number = scope.number + "33333 "; }, compile: function(element, attributes) { return { pre: function preLink(scope, element, attributes) { scope.number = scope.number + "44444 "; }, post: function postLink(scope, element, attributes) { scope.number = scope.number + "55555 "; } }; } }});//controller.js添加myController.controller('directive2',[ '$scope', function($scope) { $scope.number = '1111 '; }]);//html<body ng-app="testApp"> <div ng-controller="directive2"> <example-directive></example-directive> </div></body>上面小例子的运行结果如下:
Hello 1111 22222 44444 5555 !
由结果可以看出来,controller先运行,compile后运行,link不运行。我们现在将compile属性注释掉后,得到的运行结果如下:
Hello 1111 22222 33333
!
更多编程相关知识,请访问:编程入门!!
以上就是深入浅析Angular中Directive的用法的详细内容,更多请关注php中文网其它相关文章!
来源:php中文网
本文发布于:2023-02-26 08:31:12,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/167737147350415.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:互联网常识:深入浅析Angular中Directive的用法.doc
本文 PDF 下载地址:互联网常识:深入浅析Angular中Directive的用法.pdf
留言与评论(共有 0 条评论) |