理解Angularjs的指令

【CAPL实用开发】--- 使用VN1640A测试Busoff快慢恢复 使用VN1640A测试Busoff快慢恢复,包含具体的CAPL代码实现。 阅读详情

最近撸了一遍Reactjs,然后回过头来复习Angularjs,温故而知新,为师矣就算了,但是有提高确实是实实在在的。

Angularjs的三大特征,MVC,依赖注入,指令,其中,指令是最难学的,我个人也是理解了好久。

下面,我们尝试定义一个简单的指令:

var app = angular.module("dirModule", []);

app.directive("btnDanger", ["$rootScope", function($rootScope) {
    return {
        "restrict": "EA",
        "replace": true,
        "template": "<button type=\"button\">按钮</button>",
        "link": function(scope, element, attr) {

            element.addClass("btn").addClass("btn-danger");
        }
    }
}])

其中,restrict是自定义指令的使用方式,E代表元素的方式,A代表属性方式,M代表注释的方式,C代表class的方式,其中,E,A最常使用,M,C不推荐,如果嫌弃麻烦,直接写“ECMA”。

使用方法如下(我只列出两种常见的):

<btn-danger></btn-danger>
<span btn-danger></span>

reaplace代表是否替换标签的内容 就以这个指令来说,假如<div btn-danger></div> 如果replace为true,生成的标签就是<button type=\"button\"></button>

这儿有一个指令叫ng-transclude,就是指令在使用的时候,假如<div btn-danger><span>我是一些测试的文本</span</div>,如果没有ng-transclude这个指令,div里面的内容就被替换掉了,于是 可以稍稍的修改一下模板代码

<button type="button"><div ng-transclude></div></button>,这样,模板里面的内容就不会被替换掉了,对于组件的组合情况,非常实用。

link是最重要的一个参数(此外还有一个compile函数,但是大漠穷秋老师说如果定义了它会改变指令默认的compile函数,一般不要考虑。),接受一个函数,参数分别是scope对象,scope对象如果没有使用独立scope的情况下,是和当前的控制器共享同一个scope(实际开发中,会使用独立scope),element就是目标元素,attr就是目标元素上的属性,如果我们属性上挂载的是一个当前控制器上的事件,可以通过attr直接获得并执行之,但是一定要用scope.$apply(attr.***)去执行,这样是为了让函数的执行效果影响到scope上面的数据,视图才会得到相应的更新(参考$apply,$digest),Angularjs的设计思想是建议不要在控制器里面操作DOM,而我们操作DOM的时机就是在link函数里(element是一个已经被jquery包裹后的对象,Angularjs内置了一个精简版的jquery,可以进行jquery的一系列操作,可以console打印出来看一下)。

下面来一个更复杂的指令:

app.directive("myButton", ["$rootScope", function($rootScope) {
    return {
        "scope": {
            "innerHtml": "@",
            "selfHover": "&",
            "selfOut": "&"
        },
        "restrict": "EA",
        "replace": true,
        "template": "<button type=\"button\"  ng-bind=\"innerHtml\"></button>",
        "link": function(scope, element, attr) {

            element.addClass("btn").addClass("btn-danger");


            element.bind("mouseover", function() {

                scope.$apply(scope.selfHover);

            });

            element.on("mouseout", function() {

                scope.$apply(scope.selfOut);

            });
        }
    }
}]);


先贴出controller的代码,然后再详细阐述:

var app = angular.module("ctrlModule", ["dirModule", "serviceModule"]);

app.controller("baseController", ["$rootScope", "$scope", function($rootScope, $scope) {


    $scope.data = {
        name: "yangxu",
        age: "22"
    };


    $scope.eventClick = function() {

        alert("click");

    };


    $scope.eventHandler = function() {

        $scope.data = {
            name: "lijiayu",
            age: 21
        };

    };

    $scope.eventOut = function() {


        $scope.data = {
            name: "yangxu",
            age: "22"
        };

    }




}]);

html:

  <my-button inner-html='{{data.name}}' self-hover="eventHandler()" self-out="eventOut()"></my-button>

本文的第一个指令并没有使用独立scope,当指令修改了scope的数据以后,如果共享一个scope,就像多线程争抢的时候,大家都操作一个东西,肯定会出问题,于是出现了独立scope(独立scope,我个人的理解就是指令作用域上的scope)。

scope有3种绑定形式,"&","=","@",其中@绑定是字符串绑定,大漠穷秋老师讲的比较复杂,我个人的理解就是把挂载有当前指令上的属性,挂载到当前指令所属scope上,这个针对字符串进行绑定(我个人的理解就是一种单向绑定)。“=”是对象绑定,简单的理解就是双向数据绑定。假设现在挂着有当前指令的元素的某个属性是来自当前控制器ng-model的一个值。这个值传递到指令内部以后,指令修改它以后,还会影响到当前控制器的这个值。“&”,主要是针对函数。假如使用了独立scope,举例子来说吧,在上述代码中,selfHover代表的就是父控制器的中绑定的函数,然后在link函数中,我们就不能直接使用scope.$apply(attr.selfHover)执行方法了,因为使用隔离的scope,将拿不到父控制器中的方法,而是使用scope.$apply(scope.selfHover);

虽然Angularjs适合开发一些大型单页面应用程序,但是对于多页面的应用程序,如果我们把一些公用的代码抽到指令里面去(如何模块化组织Angularjs代码可以参考我的;另一篇日志),在需要的地方注入,可以编写出维护性良好的Web应用程序。


注意:

1.自定义属性避免使用data-开头的属性。

2.指令如果以元素形式使用的话,那么,一定要使用<directive></directive>这样的形式,避免使用<directive />这种形式。

3.独立scope上绑定的字段,在使用指令的时候,尽量符合驼峰命名法的规范,然后目标元素上面书写的时候必须符合"x-x"这样的形式,比如ngClick,这个指令,在html元素上就使用的是ng-click 


以上内容参考自imooc大漠穷秋老师所讲授的内容,有参考了金旭亮老师的Angularjs讲解,http://mooc.study.163.com/course/BIT-1000013000#/info,向他们致谢。





Python Trimesh库实战:5分钟搞定STL文件解析与3D模型可视化 本文介绍了如何使用Python的Trimesh库快速解析STL文件并进行3D模型可视化。通过简洁的代码示例,演示了从环境搭建、模型加载、几何数据提取到基础变换和批量处理的核心流程,帮助开发者和工程师在5分钟内高效完成3D数据处理与可视化任务。 阅读详情

相关推荐

YooAsset可寻址模式避坑指南:从路径加载到Addressable的完整迁移方案

本文详细介绍了将Unity项目从传统路径加载迁移到YooAsset可寻址模式的完整方案。针对中大型项目在迁移过程中遇到的路径耦合、依赖管理、热更新等痛点,提供了从架构设计、环境配置、代码迁移到性能优化的实战指南,并分享了实际项目的改造案例与避坑经验,帮助团队高效完成资源管理系统的重构。

weixin_28304023的博客 512

AngularJS directive指令之require部分

这部分用到了angularjs的$parsers相关知识,可以参考我的另一篇: 在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流。举个简单的例子,假如我们现在需要编写两个指令,在linking函数中有很多重合的方法,为了避免重复,我们可以将这个重复的方法写在第三个指令的 controller中,然后在另外两个需要的指令中require这个拥

一生为追梦的博客 1万+

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

angularjs指令link函数参数scope,指令controller依赖注入的$scope,与指令外部controller的$scope的关系

还是看代码 当指令中scope:false时                                                                 var app = angular.module('myapp', []);             app.controller('myController', function($

timeless的博客 6344

测试dali协议的软件,DALI2.0和DALI1.0完美兼容同一个模块,测试每项可过协议

DALI2.0和DALI1.0完美兼容同一个模块,测试每项可过协议深圳聚积智能 夏先生 13246760327 QQ 349098308■IEC62386-102(V2.0)通过测试内容IEC62386-102/2.1/Test preambleIEC62386-102/3.1/Polarity testIEC62386-102/3.2/Maximum and minimum system v...

weixin_35343788的博客 1352

LIN协议栈 AUTOSAR架构下 状态管理

LIN State Manager 通过对这些状态的管理和转换,实现了对 LIN 总线通信状态的精确控制,以满足汽车电子系统中不同场景的需求。

汽车电子从业者,电子爱好者。 2052

用ES6编写AngularJS程序是怎样一种体验

AngularJS不用我赘述,前端开发人员一定耳熟能详。有人称之为MVWhatever框架,意思是使用AngularJS,你可以参考任意范式进行应用开发,无论是MVC、还是MVVVM都信手拈来,只要你懂,范式在AngularJS手下,都可以轻松适配。 随着各种现代浏览器、以及node对ES6的支持,已经有越来越多的ES6特性可以在程序中使...

weixin_33734785的博客 216

C++控制台实现简单的注册登录

C++控制台实现简单的注册登录 #include<iostream> #include<string> #include <vector> #include <conio.h> void Display();//调用display显示switch()界面 void Register();//注册 void Enter();//登录 using nam...

乔路非 2万+

angularJS概念理解一:指令

ng-app这样的标记我们称之为指令。模板通过指令指示AngularJS进行必要的操作。 比如:ng-app指令用来通知AngularJS自动引导应用;ez-clock 指令用来通知AngularJS生成指定的时钟组件。          当AngularJS启动应用时,它会通过一个编译器解析处理这个模板文件,生成的结果就是: 视图: 模板(包含指令的HTML文件)和指令实现 (J

ll_xiaohanqing_91的博客 509

数据预处理之数据平滑处理#matlab

介绍基于 MATLAB 的数据平滑方法,主要介绍 smooth 函数、smoothts 函数和 medfilt1 函数的用法。

m0_56619132的博客 2417

5、自适应 RBF 神经网络控制方法解析

本文详细解析了基于RBF神经网络的多种自适应控制方法,包括针对函数未知、参数未知以及存在外部干扰的非线性系统的控制策略。通过李雅普诺夫稳定性理论设计自适应律,确保闭环系统稳定,并结合仿真示例和MATLAB代码实现,展示了方法的有效性。文章还对比了不同控制方法的适用场景,并给出了实际应用流程,为复杂系统控制提供了系统性解决方案。

ol789012的博客 75

AngularJS指令学习和理解

Angular重要部分之一 指令指令可以分为四种使用的方式 1、作为一个新的HTML元素来使用。 或者 2、作为一个元素的属性来使用。3、作为一个元素的类来使用。4、作为注释来使用。 注意在directive: hello中间要加一个空格下面具体来介绍一下这四种指令的使用方法吧.directive('hello',function(){ return { restrict:'A

一个小毛头的博客 1210

NVIDIA Isaac GR00T N1.5 人形机器人强化学习入门教程(四)Lerobot、宇树 G1 等不同形态机器人微调教程

本笔记本是一份关于如何在新的数据集上对GR00T-N1预训练模型进行微调的教程。

2506_90492529的博客 1667

理解AngularJS指令 -- ng-view

理解AngularJS指令 – ng-view 在本文中我们将探索ng-view指令内部的实现方式,并且创建一个“ngMultiView”指令, 从AngularJS 1.2开始,ngView指令以及$route service 都被移动到了一个单独的ngRoute模块中。于是,如果你需要使用ngView和route的话,必须显式的声明这个模块作为依赖。另外,otherwise语法也和

pdw2009的专栏 4万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

angularJs 指令的理解

指令:   可以把指令理解成为特定的DOM 上运行的函数,指令扩展了这个元素的功能; 例如:ng-click--在DOM元素上绑定了一个click事件的监听,并在监听到事件时运行angular表达式 自定义事件:   directive(name,function(){return{...}}); 以下是自定义指令的全部配置属相 myModule.directive('newDir...

weixin_30580341的博客 80

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

我所理解的AngularJS指令和控制器的交互原理

AngularJS指令和控制器的交互原理 以AngularJS 指令中的‘@’来做解释。

u011070165的专栏 1082

Statistics and Machine Learning Toolbox

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

angularjs速成学习个人理解_7指令Directives

AngularJS 让我们可以继承HTML带有新的属性,这个功能叫做指令Directives AngularJS 有一组内置的指令,可以为您的应用程序提供功能。 AngularJS 也让我们自定义自己的指令 AngularJS指令是用前缀ng的扩展HTML属性 通用的内置指令包括: ng-app ng-init ng-bind ng-controller ng-mod

dl0246的博客 373

angularjs directive scope变化为啥html,如何理解angularJS自定义指令directive中的scope

大家好,我是IT修真院郑州分院,一枚正直、纯洁、善良的web程序员。今天给大家分享一下,修真院官网 js任务中可能会使用到的知识点:如何理解angularJS自定义指令directive中的scope一、背景介绍指令定义AngularJS与JQuery最大的区别表现在数据双向绑定,实质就是DOM的操作形式不一样。 JQuery通过选择器找到DOM元素,再赋予元素的行为; 而AngularJS则是,...

weixin_42548782的博客 212

Angular-Strap编译原理:深入理解AngularJS指令生命周期

Angular-Strap作为AngularJS与Bootstrap集成的桥梁,其核心编译原理直接决定了指令的性能和稳定性。在AngularJS 1.2+框架中,指令生命周期管理是前端开发的关键技术点,掌握这些原理能显著提升应用开发效率。 [![AngularStrap编译流程](https://raw.gitcode.com/gh_mirrors/an/angular-strap/raw/95

gitblog_01036的博客 929

《AngularJS权威教程》中关于指令双向数据绑定的理解

在《AngularJS权威教程》中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具体代码如下: <!doctype html> <html ng-app="myApp"> <head> <script src="https://ajax...

weixin_30951743的博客 111

highcharts-ng源码解析:理解AngularJS组件化指令实现

探索highcharts-ng源码实现机制,深入理解AngularJS组件化指令如何优雅地集成Highcharts图表库。📊 **Highcharts-ng** 是一个专门为AngularJS设计的图表指令库,它巧妙地将功能强大的Highcharts图表库封装成AngularJS组件,让开发者能够以声明式的方式在AngularJS应用中创建交互式图表。这个开源项目的核心价值在于简化了Highc

gitblog_07567的博客 1025

谈谈关于angularjs指令中complie函数和link函数的理解

compile函数和link函数的区别可以从他们形参看出来:compile: function(element, attrs){ ... } link: function(scope, element, attrs){ ... }由上我们可以看出,link函数的形参中包含了scope作用域。也就是说compile函数在指令被调用的时候,只能对元素和和元素的属性进行操作,也就是js中的

小新正在敲代码 1287

深入理解AngularJS指令中的Scope,三种属性的不同点

https://www.cnblogs.com/shawnhu/p/8476801.html 一、概念说明 可以是true、false、哈希对象{ } 1.true 新创建了一个作用域,且继承了父作用域;在初始化的时候,用了父作用域的属性和方法,去填充了我们这个新的作用域。它和父作用域不是同一个作用域。 2.false默认(不指定时候) 创建的指令和父作用域(其实是同一个作用域)共享同一个model模型,在指令中修改模型数据...

qq_26780317的博客 811

angularJS 系列(二)——理解指令 understanding directives

参考:https://github.com/angular/angular.js/wiki/Understanding-Directives Injecting, Compiling, and Linking functions When you create a directive, there are essentially up to 3 function layers for you ...

weixin_30478757的博客 85

【AngularJS】6.AngularJS 事件指令/input相关指令/样式指令/DOM操作指令详解

1.AngularJS 事件指令 (1)ng-click 鼠标点击事件 Increment count: {{count}} (2)ng-dblclick 鼠标双击事件 Increment (on double click) count: {{count}}(3)ng-mousedown 鼠标点击事件 Increment (on mouse down) cou

返璞归真 2677

AngularJs指令(一)

  AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋。最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用,一直都是学了就忘记了),也写写复习的知识点,希望这次能让我对AngularJs的理解更深入透彻。 知识概要 一、什么是指令Directive 二、指令的编译过程及命名方式 二、Angul...

weixin_34367257的博客 80
上一篇: 全面解析Angular中$Apply()及$Digest()的区别
下一篇: sequelize解决模型不是sequelize创建的实例
遛狗的代码
博客等级 码龄11年 10粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值