文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Angular中Directive怎么用

2023-06-14 12:31

关注

这篇文章主要介绍了Angular中Directive怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Angular Directive 学习

学习目的:为了更好的了解 ng directive 的使用方法。

Directive可能是AngularJS中比较复杂的一个东西了。一般我们将其理解成指令。AngularJS自带了不少预设的指令,比如ng-app,ng-controller这些。可以发现个特点,AngularJS自带的指令都是由ng-打头的。

那么,Directive究竟是个怎么样的一个东西呢?我个人的理解是这样的:将一段html、js封装在一起,形成一个可复用的独立个体,具体特定的功能。下面我们来详细解读一下Directive的一般性用法。

AnguarJS directive的常用定义格式以及参数说明

看下面的代码:
var myDirective = angular.module('directives', []);myDirective.directive('directiveName', function($inject) {    return {        template: '<div></div>',        replace: false,        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 {    name: '',    priority: 0,    terminal: true,    scope: {},    controller: fn,    require: fn,    restrict: '',    template: '',    templateUrl: '',    replace: '',    transclude: true,    compile: fn,    link: fn}

相关教程推荐:《angular教程》

如上所示,return的对象中会有很多的属性,这行属性都是用来定义directive的。

下面我们来一个个的说明他们的作用。

关于scope

这里关于directive的scope为一个object时,有更多的内容非常有必要说明一下。看下面的代码:

scope: {    name: '=',    age: '=',    sex: '@',    say: '&'}

这个scope中关于各种属性的配置出现了一些奇怪的前缀符号,有=,@,&,那么这些符号具体的含义是什么呢?再看下面的代码:

<div my-directive name="myName" age="myAge" sex="male" say="say()"></div>复制代码
function Controller($scope) {    $scope.name = 'Pajjket';    $scope.age = 99;    $scope.sex = '我是男的';    $scope.say = function() {        alert('Hello,我是弹出消息');    };}
可以看出,几种修饰前缀符的大概含义:

在本地scope属性与parent scope属性之间设置双向的绑定。如果没有指定attr名称,那么本地名称将与属性名称一致。

<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><h5>Weather for {{ngModel}}</h5</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>

template与templateUrl的区别和联系

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的内容。    }});
scope重定义
//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 Else'        };    }]);// 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是没有定义的
我们将上面的directive简单的改一下,
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 Else

因为此时的directive没有定义独立的scope,customerInfo是undefined,所以结果正好与上面相反。

transclude的使用

myDirective.directive('myEvent', function() {    return {        restrict: 'E',        transclude: true,        scope: {            'close': '$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 = false;            }, 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="close()">×</a>    <div ng-transclude></div></div>
<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>
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 !

由结果可以看出来,controller先运行,link后运行,link和compile不兼容。一般地,compile比link的优先级要高。

感谢你能够认真阅读完这篇文章,希望小编分享的“Angular中Directive怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯