详解angular 中的自定义指令之详解API

发布时间 - 2026-01-11 01:58:26    点击率:

自定义属性的四种类别

分为: 元素E,属性A,注释M,类C , 分别如下:

 <my-dir></my-dir>
 <span my-dir="exp"></span>
 <!-- directive: my-dir exp -->
 <span class="my-dir: exp;"></span>

简单创建一个指令

html结构:

<div ng-controller="myCtrl">
 <div my-customer></div>
</div>

JavaScript结构:

angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
   $scope.customer = {
    name: 'Naomi',
    address: '1600 Amphitheatre'
   };
  }])
  .directive('myCustomer', function() {
   return {
    template: 'Name: {{customer.name}} Address: {{customer.address}}'
   };
  });

输出:

Name: Naomi Address: 1600 Amphitheatre

说明: 此处,myCtrl 中定义的 $scope.customer 属性和属性值都在指令中的模板使用了。同样的,在指令return 对象中的 template 也可被替换成一路径,在路径html中书写和template中同样的代码,使用这种方式,可以操作更多代码。

templateUrl 函数式编程

html结构:

<div ng-controller="myCtrl">
  <div my-customer></div>
</div>

javascript结构:

 angular.module('myApp', [])
 .controller('myCtrl', ['$scope', function($scope) {
  $scope.customer = {
   name: 'Naomi',
   address: '1600 Amphitheatre'
  };
   }])
 .directive('myCustomer', function() {
  return {
   templateUrl: function(elem, attr) {
    return 'customer-' + attr.type + '.html';
   }
  };
 });

不同的templateUrl ①

 Name: {{customer.name}}

不同的templateUrl ②

 Address: {{customer.address}}

输出结果:

Name: Naomi
Address: 1600 Amphitheatre

说明: templateUrl 的值可以是一个函数返回值,返回用于指令中的html模板的url。

隔离指令的作用域

① 通过不同的controller

html结构:

<div ng-app="myApp">
  <div ng-controller="myCtrl1">
    <my-customer></my-customer>
  </div>
  <div ng-controller="myCtrl2">
    <my-customer></my-customer>
  </div>
</div>

javascript结构:

angular.module('myApp', [])
  .controller('myCtrl1', ['$scope', function($scope) {
   $scope.customer = {
    name: 'Naomi',
    address: '1600 Amphitheatre'
   };
  }])
  .controller('myCtrl2', ['$scope', function($scope) {
   $scope.customer = {
    name: 'Igor',
    address: '123 Somewhere'
   };
  }])
  .directive('myCustomer', function() {
   return {
    restrict: 'E',
    templateUrl: 'my-customer.html'
   };
  });

templateUrl html 结构:

 Name: {{customer.name}} Address: {{customer.address}}

输出结果:

 Name: Naomi Address: 1600 Amphitheatre
 Name: Igor Address: 123 Somewhere

说明: 可见 不同的controller 有不同的作用范围。虽然指令一样,每次渲染都是分离的,所以我们可以抽象出来指令,用于html模板和代码的重用,封装。但是这样又不是很好,因为用了两个controller,我们可以使用指令中的scope而不是controller里的scope来替代,具体做法是将外部的scope 映射到指令内部的scope, 如下:

② 通过指令属性映射scope

html结构:

<div ng-app="myApp" ng-controller="myCtrl">
 <my-customer info="naomi"></my-customer>
 <my-customer info="igor"></my-customer>
</div>

javascript 结构:

 angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
   $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
   $scope.igor = { name: 'Igor', address: '123 Somewhere' };
  }])
  .directive('myCustomer', function() {
   return {
    restrict: 'E',
    scope: {
     customerInfo: '=info'
    },
    templateUrl: 'my-customer-iso.html'
   };
  });

templateUrl html结构:

Name: {{customerInfo.name}} Address: {{customerInfo.address}}

编译后的html结果:

 Name: Naomi Address: 1600 Amphitheatre
 Name: Igor Address: 123 Somewhere

③ 指令中的如果定义scope属性则html中的scope不会直接继承controller中的scope,在html中使用的都需要在scope:{}中声明,否则就是undefined

html 结构:

 <div ng-app="myApp" ng-controller="myCtrl">
   <my-customer info="naomi"></my-customer>
 </div>

javascript结构:

 angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
   $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
   $scope.vojta = { name: 'Vojta', address: '3456 Somewhere Else' };
  }])
  .directive('myCustomer', function() {
   return {
    restrict: 'E',
    scope: {
     customerInfo: '=info'
    },
    templateUrl: 'my-customer-plus-vojta.html'
   };
  });

  templateUrl html结构:

Name: {{customerInfo.name}} Address: {{customerInfo.address}}
<br>
Name: {{vojta.name}} Address: {{vojta.address}}

html编译后的结果:

Name: Naomi Address: 1600 Amphitheatre
Name: Address:

说明: vojta 在指令中的scope没有被定义,不会直接继承在controller中的,那么他就是undefined,所以就是空白(什么都不显示)

可操作DOM的指令

创建一个用于操作dom的指令,如果需要dom操作也都应该放在指令里。

html 结构:

 <div ng-app="myApp" ng-controller="myCtrl">
  Date format: <input ng-model="format"> <hr/>
  Current time is: <span my-current-time="format"></span>
 </div>

javascript结构:

angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
    $scope.format = 'M/d/yy h:mm:ss a';
  }])
  .directive('myCurrentTime', function($interval, dateFilter) {
    return {
     restrict: 'AE',
     link: function(scope, element, attr){
       var format, timeoutId;

      /* 更新时间函数 */
      function updateTime() {
       element.text(dateFilter(new Date(), format));
      }

      /* 监视时间格式的改变 */
      var attrWatch = scope.$watch(attrs.myCurrentTime, function(value) {
       format = value;
       updateTime();
      });

      /* 定时器 */
      timeoutId = $interval(function() {
       updateTime(); // update DOM
      }, 1000);

      /* 页面跳转后移除定时器防止内存泄露 */
      element.on('$destroy', function() {
       $interval.cancel(timeoutId);
       attrWatch(); // 移除watch
      });
    }
   };
  });

说明: 在link函数中,操作dom节点,让dom的文本节点动态显示时间跳动。在页面跳转之后及时清除定时器和监视器以免发生内存泄漏。

通过transclude和ng-transclude创建可包裹其他元素的指令

html结构:

 <div ng-app="myApp" ng-controller="myCtrl">
   <my-dialog>Check out the contents, {{name}}!</my-dialog>
 </div>

javascript结构:

 angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
    $scope.name = 'Tobias';
  }])
  .directive('myDialog', function() {
   return {
    restrict: 'E',
    transclude: true,
    scope: {},
    templateUrl: 'my-dialog.html',
    link: function(scope) {
      scope.name = 'Jeff';
    }
 };
});

templateUrl html 结构:

 <div class="alert" ng-transclude></div>

编译后的html结构:

Check out the contents, Tobias!

说明: 指令中的scope本应隔离controller中的作用域的,但是由于设置了transclude=true选项,scope就会继承controller中的定义,所以最终是Tobias而不是Jeff。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angularjs  # 自定义指令  # angular自定义指令API  # 深入讲解AngularJS中的自定义指令的使用  # 详解AngularJS中自定义指令的使用  # AngularJS优雅的自定义指令  # AngularJS创建自定义指令的方法详解  # AngularJS 自定义指令详解及示例代码  # AngularJS自定义指令之复制指令实现方法  # 跳转  # 创建一个  # 移除  # 都是  # 而不是  # 是一个  # 就会  # 很好  # 更新时间  # 放在  # 都在  # 也可  # 我们可以  # 用了  # 也都  # 自定义  # 可以使用  # 又不  # 四种  # 什么都不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript读取文本节点方法小结  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何用PHP工具快速搭建高效网站?  如何快速搭建高效WAP手机网站吸引移动用户?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  教你用AI润色文章,让你的文字表达更专业  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何实现用户密码重置功能?(完整流程代码)  深入理解Android中的xmlns:tools属性  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  如何快速选择适合个人网站的云服务器配置?  米侠浏览器网页背景异常怎么办 米侠显示修复  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  太平洋网站制作公司,网络用语太平洋是什么意思?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel如何使用.env文件管理环境变量?(最佳实践)  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何为不同团队 ID 动态生成多个独立按钮  如何快速搭建高效WAP手机网站?  网站建设保证美观性,需要考虑的几点问题!  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  香港服务器租用每月最低只需15元?  实例解析Array和String方法  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  无锡营销型网站制作公司,无锡网选车牌流程?  如何快速登录WAP自助建站平台?  Android仿QQ列表左滑删除操作  高端智能建站公司优选:品牌定制与SEO优化一站式服务  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何确认建站备案号应放置的具体位置?  如何在腾讯云服务器快速搭建个人网站?  如何用wdcp快速搭建高效网站?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  bootstrap日历插件datetimepicker使用方法  成都网站制作公司哪家好,四川省职工服务网是做什么用?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  智能起名网站制作软件有哪些,制作logo的软件?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  javascript中闭包概念与用法深入理解  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何在香港免费服务器上快速搭建网站?  如何在万网开始建站?分步指南解析