惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Troy Hunt's Blog
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
T
Tenable Blog
L
LINUX DO - 热门话题
V
Visual Studio Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
Netflix TechBlog - Medium
SecWiki News
SecWiki News
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Project Zero
Project Zero
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
Recorded Future
Recorded Future
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
S
Securelist
Spread Privacy
Spread Privacy
L
LangChain Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Last Watchdog
The Last Watchdog
Attack and Defense Labs
Attack and Defense Labs
博客园 - 司徒正美
Help Net Security
Help Net Security
L
Lohrmann on Cybersecurity
人人都是产品经理
人人都是产品经理
Forbes - Security
Forbes - Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
PCI Perspectives
PCI Perspectives
博客园 - 【当耐特】
T
Tor Project blog

博客园 - 开发手游啦啦啦

用TypeScript开发爬虫程序 ABP导航源码分析 ABP的语言切换 AngularJs自定义指令详解(10) - 执行次序 AngularJs自定义指令详解(9) - terminal AngularJs自定义指令详解(7) - multiElement AngularJs自定义指令详解(6) - controller、require AngularJs自定义指令详解(5) - link AngularJs自定义指令详解(4) - transclude AngularJs自定义指令详解(3) - scope AngularJs自定义指令详解(2) - template AngularJs自定义指令详解(1) - restrict ABP的Zero Sample ABP的工作单元 ABP的数据过滤器(Data Filters) ABP的事件总线和领域事件(EventBus & Domain Events) 初入Cocos2d-x 2.2 quick-cocos2d-x之testlua之VisibleRect.lua quick-cocos2d-x之testlua之mainMenu.lua
AngularJs自定义指令详解(8) - priority
开发手游啦啦啦 · 2015-07-05 · via 博客园 - 开发手游啦啦啦

priority

默认值为0.

当一个元素上声明两个指令,而且它们的priority一样,谁先被调用?这个需要分情况讲。下面先给个例子:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <script src="../lib/angular-1.3.16/angular.min.js"></script>
    <script src=""></script>
    <title></title>
    <script language="JavaScript">
        var app = angular.module("app", []);
        app.directive('d1',function() {
            return{
                link: function (scope) {
                    scope.greeting += 'World ';
                }
            };
        }).directive('d2',function() {
            return{

                link: function (scope) {
                    scope.greeting += 'AngularJs ';
                }
            };
        });
    </script>
</head>
<body ng-app="app">
<div ng-init="greeting='Hello '" d1 d2>{{greeting}}!</div>
</body>
</html>

输出:

Hello AngularJs World !

可见ng-init先行一步,把greeting赋值为'Hello ',然后是指令d2的链接函数,最后是d1

试一下,修改DOM中声明的次序:

<div d2 d1 ng-init="greeting='Hello '">{{greeting}}!</div>

没用,输出不变。

再试一下,修改JavaScript中声明的次序:

        app.directive('d2',function() {
            return{
                link: function (scope) {
                    scope.greeting += 'World ';
                }
            };
        }).directive('d1',function() {
            return{

                link: function (scope) {
                    scope.greeting += 'AngularJs ';
                }
            };
        });

这下变了!输出为:

Hello World AngularJs !

魂淡,AngularJs居然使用字母顺序来确定链接函数谁先被调用!不信?试试把d1改名为e1,输出就会变回:

Hello AngularJs World !

这时候我们不得不使用priority了!否则代码没法看了:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <script src="../lib/angular-1.3.16/angular.min.js"></script>
    <script src=""></script>
    <title></title>
    <script language="JavaScript">
        var app = angular.module("app", []);
        app.directive('d1',function() {
            return{
                link: function (scope) {
                    scope.greeting += 'World ';
                }
            };
        });
        app.directive('d2',function() {
            return{
                priority:1,
                link: function (scope) {
                    scope.greeting += 'AngularJs ';
                }
            };
        });
    </script>
</head>
<body ng-app="app">
<div d1 d2 ng-init="greeting='Hello '">{{greeting}}!</div>
</body>
</html>

输出:

Hello World AngularJs !

奇怪的是d2的优先级更高,为什么还是先调用了d1的链接函数?

原来我们书写链接函数的方式是一个简略方式,实际上是一个postLink:

link: function postLink( ... ) { ... }

详细的写法是这样的:

  link: {
   pre: function preLink(scope, iElement, iAttrs, controller) { ... },
   post: function postLink(scope, iElement, iAttrs, controller) { ... }
}

preLink的执行次序是由高(优先级)至低(优先级)。

postLink的执行次序是由低至高。

验证一下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <script src="../lib/angular-1.3.16/angular.min.js"></script>
    <script src=""></script>
    <title></title>
    <script language="JavaScript">
        var app = angular.module("app", []);
        app.directive('d1',function() {
            return{
                link: {
                    pre: function (scope) {
                        scope.greeting += 'World ';
                    }
                }
            };
        });
        app.directive('d2',function() {
            return{
                priority:1,
                link: {
                    pre: function (scope) {
                        scope.greeting += 'AngularJs ';
                    }
                }
            };
        });
    </script>
</head>
<body ng-app="app">
<div d1 d2 ng-init="greeting='Hello '">{{greeting}}!</div>
</body>
</html>

输出:

Hello AngularJs World !

至于何为postLink和preLink以及它们的区别在哪,后面再说。

 下面看看有模板输出的情况:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <script src="../lib/angular-1.3.16/angular.min.js"></script>
    <script src=""></script>
    <title></title>
    <script language="JavaScript">
        var app = angular.module("app", []);
        app.directive('d1',function() {
            return{
                priority:1,
                template:'World'
            };
        });
        app.directive('d2',function() {
            return{
                priority:0,
                template:'AngularJs'
            };
        });
    </script>
</head>
<body ng-app="app">
<div d1 d2></div>
</body>
</html>

以上代码,d1、d2都有模板,而因为d1的优先级更高,所以最终显示的是World,而d2的模板被完全无视了。

可以改一下d2的优先级为2,试试输出是否改变。