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

19、探索 Angular CDK:虚拟滚动、键盘导航与弹出菜单的实现 本文介绍了如何使用 Angular CDK 实现虚拟滚动、键盘导航以及带箭头的弹出菜单功能,从而提升大型列表的渲染性能和用户体验。涵盖了从基础实现到高级应用的详细步骤和原理说明。 阅读详情

在ng中指令相关api在 这里 也许归类不明确,后期再整理,博客会一直被维护

自定义属性的四种类别

分为: 元素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。


未完。。。

Angular17之Angular自定义指令详解 1 什么是HTML   HTML文档就是一个纯文本文件,该文件包含了HTML元素、CSS样式以及JavaScript代码;HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲染这些DOM节点来呈现内容,用户在浏览器中看到的内容就是浏览器渲染DOM对象后的结果。 2 指令的分类   组件、属性指令、结构性指令 3 指定义指令常用到的一些常量   3.1 Directive     用于装饰控制器类来指明该控制器类是一个自定义指令控制器类   3.2 ElementRef     作为DOM对象的引用使用,通过构造器进行依赖注入,它的实例代表标注有自定义指令那个元素的 立即下载

相关推荐

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

自定义属性的四种类别 分为: 元素E,属性A,注释M,类C , 分别如下: <!-- directive: my-dir exp --> 简单创建一个指令 html结构: JavaScript结构: angular.module('myApp', []) .controller('myCtrl',

ng自定义指令和四种用法

ng自定义指令只有一种方法,通过directive去定义声明,使用有四种方法,作为元素、属性、class类、注释。以返回一个对象的方式定义。需要注意是名称必须以驼峰式命名,使用时变横杠的方式,比如名称为:myTest, 使用: my-test。ng内置的指令也是这么用的。 自定义指令的常用的属性有这么一些:name  priority  terminal  scope  controller  

前端开发技术 3542

Angular中的内置指令和自定义指令

NG中的指令,到底是什么(what)?为什么会有(why)?以及怎样使用(how)?What:在NG中,指令扩展HTML功能,为DOM元素调用方法、定义行为绑定数据等。Why:最大程度减少DOM操作,实现数据绑定,与业务逻辑进行交互。How:指令主要分为两种:内置指令和自定义指令,通过下面的例子,简单记录一下如何去使用。在官方API文档上罗列了很多指令,内置指令可以分为:普通指令和事件指令,他们都是作用于HTML之上的,通过添加属性的方式来实现的。简单看一下一些常用的指令。ng-app指令用来设定一个AngularJS应用程序的作用范围的根对象

自定义Angular指令

Angular指令分为三种,组件(带模板指令)、结构型指令(改变宿主文档结构)、属性型指令(改变宿主行为),下面主要介绍自定义结构型指令和自定义属性型指令。 一、自定义结构型指令 一个元素上只能放一个结构型指令 ...

rongfengjin4315的博客 2075

告别盲目调参:手把手教你用RKISP2.x Tuner理解AWB、AE、NR等核心模块

本文详细介绍了如何使用RKISP2.x Tuner工具进行ISP调试,重点解析AWB、AE、NR等核心模块的调参技巧。通过RV1126平台的实际操作演示,帮助工程师快速掌握可视化对比实验方法,告别盲目调参,提升图像信号处理效率。

weixin_30300225的博客 394

STC32G电调调试血泪史:从TPH1R403NL MOS管烧毁到PWM信号异常排查全记录

本文详细记录了STC32G无刷电调调试过程中的常见问题与解决方案,包括MOS管烧毁、PWM信号异常等关键故障排查。通过电源系统检测、驱动电路验证及三相平衡调试等实战经验,帮助硬件爱好者快速定位问题,提升电调调试效率。特别针对TPH1R403NL等MOS管的保护措施进行了重点分析。

weixin_33736048的博客 551

angular中的常用指令、如何自定义指令

angular中的常用指令、如何自定义指令

听海边涛声 812

HDMI2.1接口保护指南:从浪涌损坏案例看RK3588板子的ESD设计要点

本文深入探讨了HDMI2.1接口在RK3588板子上的ESD防护设计要点,通过真实案例分析了浪涌损坏的原因及解决方案。重点介绍了TMDS信号链路的四级防护体系、TVS管选型误区以及连接器与PCB的协同设计策略,帮助工程师有效避免静电放电导致的HDMI无输出故障。

weixin_29305337的博客 449

Angular自定义指令

Angular自定义指令 Angular自定义指令(一 ) 实现添加某个属性,标签颜色发生改变 1.创建自定义指令文件(选择器) ng g directive directive/yustyle 2.ts文件中 import { Directive, ElementRef} from '@angular/core'; @Directive({ selector: '[appYustyle]' }) export class YustyleDirective { constructor(priv

weixin_47144417的博客 2368

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8266

微信小程序审核避坑指南:巧用 wx.getAccountInfoSync 实现审核与线上环境无感切换

本文详细介绍了如何利用`wx.getAccountInfoSync`API实现微信小程序审核与线上环境的无感切换。通过环境识别技术和动态渲染架构设计,开发者可以优雅解决审核资质门槛问题,同时保持生产环境的完整用户体验。文章包含组件化实现、全局状态管理等实用方案,帮助开发者提升审核通过率。

weixin_30527423的博客 260

ng自定义指令

ng自定义指令 自定义指令( 了解 ) 如果使用: 1> 作为 属性使用 2> 作为 class 使用 3> 作为标签 a 4> 作为注释使用: 自定义指令语法: module.directive( '指令名(驼峰命名规则)', [ '...', function ( ... ) { return function | obj

ITzhongzi的博客 680

北斗三号PPP-B2b信号实战指南:从接收机配置到精度验证全流程

本文提供了北斗三号PPP-B2b信号从硬件配置到数据处理的全流程实战指南。详细解析了信号特性、接收机关键参数设置,并以飞纳接收机和Mass软件为例,演示了数据解算与精度验证方法。通过覆盖中国多地区的联调测试案例,验证了PPP-B2b服务可实现分米级实时定位精度,为无网络地区高精度应用提供了可靠解决方案。

nn3456的博客 555

如何将validate.js与现代前端框架完美集成:React、Vue、Angular的终极指南

validate.js是一个声明式的JavaScript验证库,它提供了一种简洁而强大的方式来处理表单验证和数据校验。在前端开发中,表单验证是每个项目都必不可少的功能,而validate.js以其灵活性和易用性成为了众多开发者的首选。本文将详细介绍如何将validate.js与三大主流前端框架——React、Vue和Angular进行完美集成,帮助您构建更加健壮和用户友好的Web应用。🚀 ##

gitblog_00344的博客 724

cadence allegro 17.x 降版本到16.6的转换工具

Cadence17.x版本降低到16.6版本转换工具 下载链接:Cadence17.x版本降低到16.6版本转换工具   使用方法: 软件使用比较简单,在「第一个路径输入栏」浏览指向17.x的设计文件,也就是需要降版本的17.4或者17.2的文件,然后在「第二个路径输入栏」里浏览指向转换后的文件保存路径,然后点击「转换」按钮即可。 ...

ltqdxl的博客 1万+

Impala>Impala安装部署

文章目录1.安装前提2.下载安装包、依赖包3.虚拟机新增磁盘(可选)4.配置本地yum源5.安装Impala6.修改Hadoop、Hive配置7.修改impala配置8.启动、关闭impala服务 1.安装前提 集群提前安装好hadoop,hive。 hive安装包scp在所有需要安装impala的节点上,因为impala需要引用hive的依赖包。 hadoop框架需要支持C程序访问接口,查看下...

qq_44509920的博客 839

Animate.scss与现代前端框架集成:React/Vue/Angular使用教程

Animate.scss是一款基于Dan Eden's Animate.css的Sass mixins库,提供了丰富的CSS动画效果,可以轻松地与React、Vue和Angular等现代前端框架集成,为你的Web应用增添生动的交互体验。 ## 什么是Animate.scss? Animate.scss是Animate.css的Sass版本实现,通过Sass mixins的方式提供了60多种预定

gitblog_00327的博客 393

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Folia sync-server 部署实操:5 分钟让 AI 主题同步到所有设备

你在台式机上把歌词动画调了一下午,晚上拿手机打开 Folia,字体、背景、主题全得从头再来一遍,这毛病很真实。folia-major 仓库里自带的 Folia sync-server 就是干这个的:一个自托管的跨设备同步服务,让 AI 主题和外观设置在所有设备间共用一套。读完这篇,你能自己跑起同步服务、把客户端接通、完成第一次同步。 [![Folia AI 主题歌词动画同步效果预览](https

gitblog_00964的博客 501

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何在React、Vue和Angular中集成mmenu.js:打造高效的移动端菜单体验

mmenu.js是一款功能强大的JavaScript插件,专为网站和Web应用打造类似原生应用的画布内和画布外菜单,支持滑动子菜单,是提升移动端用户体验的理想选择。本文将详细介绍如何在主流前端框架(React、Vue和Angular)中集成mmenu.js,帮助开发者快速实现专业级菜单功能。 ## 准备工作:获取mmenu.js 在开始集成之前,需要先获取mmenu.js的源代码。可以通过克隆

gitblog_00263的博客 740

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

angular-google-analytics事件追踪实战指南:trackEvent统计用户行为的完整教程

**angular-google-analytics** 是 AngularJS 生态中最流行的 Google Analytics 集成方案,而**事件追踪**(Event Tracking)则是它最核心也最常用的能力之一。通过 `trackEvent` 方法,你可以精确统计用户点击、播放、下载、表单提交等行为,把"谁看了页面"升级为"用户到底做了什么"。这份教程将带你从零上手,用最少的代码完成

gitblog_00654的博客 274

Expo LocalAuthentication 模块全解析:本地生物识别认证 API 演进与双端实现原理

`expo-local-authentication` 是 Expo 生态中面向 iOS(FaceID / TouchID)与 Android(指纹、人脸、虹膜等生物识别)提供统一本地认证 API 的官方模块。本文以该模块的完整变更日志([CHANGELOG.md](https://link.gitcode.com/i/04894803d2fbb72a09e1e39fb02abaca))为主体骨架

gitblog_00564的博客 307

[Angular 基础] - 自定义指令,深入学习 directive

这篇笔记的前置笔记为,对 Angular 的 directives 不是很了解的可以先过一下这篇笔记。

GoldenaArcher的博客 2824

(学习笔记)angular自定义指令

angularjs有两种创建自定义指令的方式: 1.module.directive(name,directiveFactory) 2.@see $compileProvider.directive() var app=angular.module(‘myApp’,[],function($compileProvider){ $compileProvider.directive(‘nameName...

qq_44858021的博客 4181

Angular:使用 [@Directive] 自定义指令

指令介绍 在 Angular 中有三种类型的指令: 组件,有模板的指令,组件是继承于指令的,只是扩展类与 UI 相关的属性。 属性型指令,改变 DOM 元素、组件或其他指令的行为和外观的指令。如,NgStyle、NgClass。 结构型指令,通过添加或移除 DOM 元素改变 DOM 布局的指令。如,NgIf、NgFor。 然而,在实际的开发中,根据业务的需要,我们经常会拓展 Ang...

Star's Tech Blog 4119

angular-spinner API完全参考:指令、服务与配置选项详解

angular-spinner是一个基于Spin.js的Angular指令,用于在应用中显示动画加载指示器。本文将全面解析其API组成,包括核心指令、服务方法和配置选项,帮助开发者快速掌握这个强大工具的使用技巧。 ## 核心指令:usSpinner ### 基础用法 usSpinner是angular-spinner的核心指令,通过在HTML元素上添加`us-spinner`属性即可启用加载

gitblog_00152的博客 686

angular自定义指令

1、什么是指令? 官方文档的解释:指令是为 Angular 应用程序中的元素添加额外行为的类。使用 Angular 的内置指令,你可以管理表单、列表、样式以及要让用户看到的任何内容。 2、指令的分类 1)组件—— 带有模板的指令。这种指令类型是最常见的指令类型。 2)属性型指令—— 更改元素、组件或其他指令的外观或行为的指令。 3)结构型指令—— 通过添加和删除 DOM 元素来更改 DOM 布局的指令。 内置属性指令:内置指令只会使用公开 API。它们不会访问任何无法被其它指令访问的私有 ...

weixin_36430673的博客 1507
上一篇: 微信小程序-初识小程序架构骨架
下一篇: 考研英语 - word-list-12
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值