angularJs關于指令的一些冷門屬性

  我們使用ng的時候,經常會使用到指令,大家所熟知的屬性我在這里就不介紹了,講講大家沒怎么留意的屬性

  1.multiElement

    這是指定指令作用區間的功能,最常用的就是ng-repeat-start和ng-repeat-end了。

  2.priority

    指令優先級,優先級越高,指令越早執行。

  3.terminal

    是否允許優先級低的指令起作用,如果是true,那么只有比當前指令或跟當前指令等級相同的指令才可以執行。最典型的就是ngIf

  4.templateNamespace

    聲明模板的格式有三種選擇 svg、html、math

  5.transclude?

    或許有人疑問了,transclude也算是冷門屬性嗎?其實大家對transclude了解并沒有想象的那么深,transclude是一個挺復雜的屬性,一般大家會用到的也僅僅是true,false。這兩個屬性我在這里就不講了,在這里我主要講的是transclude:element,我google了一整天都沒找到正確描述這個屬性的方法。我覺得google出來的答案太文檔化了。最后在研究$transclude才看出來這個屬性的功能究竟在哪里。再講功能前我們先了解下$transclude?

    無論在指令的compile還是link時期我們的最后一個參數就是$transclude了,這里其實我們看看源碼是如何定義的,我看的源碼是ng1.5.3的    

function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) {var transcludeControllers;// No scope passed in:if (!isScope(scope)) {slotName = futureParentElement;futureParentElement = cloneAttachFn;cloneAttachFn = scope;scope = undefined;}if (hasElementTranscludeDirective) {transcludeControllers = elementControllers;}if (!futureParentElement) {futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;}if (slotName) {// slotTranscludeFn can be one of three things://  * a transclude function - a filled slot//  * `null` - an optional slot that was not filled//  * `undefined` - a slot that was not declared (i.e. invalid)var slotTranscludeFn = boundTranscludeFn.$$slots[slotName];if (slotTranscludeFn) {return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);} else if (isUndefined(slotTranscludeFn)) {throw $compileMinErr('noslot','No parent directive that requires a transclusion with slot name "{0}". ' +'Element: {1}',slotName, startingTag($element));}} else {return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);}}

還有一個另一個函數要特別指出來,就是最后返回的?boundTranscludeFn?這個方法,下面是他的源碼

function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {if (!transcludedScope) {transcludedScope = scope.$new(false, containingScope);transcludedScope.$$transcluded = true;}return transcludeFn(transcludedScope, cloneFn, {parentBoundTranscludeFn: previousBoundTranscludeFn,transcludeControllers: controllers,futureParentElement: futureParentElement});}

這兩個方法到底是在做什么呢?其實就是克隆了當前指令的節點,并生成子作用域。克隆的節點由transclude定義,如果你的屬性是true,則克隆的是指令模板中的ng-transclude所在的DOM節點,及其子節點。如果屬性是element則克隆整個模板的節點。

這是兩個指令的代碼

 angular.module('MyApp', []).directive('dropPanel', function() {return {transclude: 'element',replace: true,template: "<div class='drop-panel'>" +"<span ng-transclude class='111'></span>" +"</div>",link: function(scope, el, c, d, $transclude) {$transclude(function ngRepeatTransclude(clone, scope) {console.log(clone);})}}}).directive('dropPanel2', function() {return {transclude: true,replace: true,template: "<div class='drop-panel'>" +"<span ng-transclude class='111'></span>" +"</div>",link: function(scope, el, c, d, $transclude) {$transclude(function ngRepeatTransclude(clone, scope) {console.log(clone);})}}})

如果你覺得replace干擾了對結果的理解,你可以注釋掉,然后查看控制臺中打印出來的clone,你就能知道所謂transclude的屬性聲明為element的作用了,我們打開replace目的在于能較清楚的查看DOM節點,來獲得結論,下面就是兩者編譯后DOM節點的區別了

  看完上面的圖,你可以明顯的區別到兩者對DOM的克隆不一樣的,另外如果在聲明屬性為‘element’時,需要聲明replace為true,才能渲染出來。我查了很多資料,最終用斷點得出了我認為對的結論,斷點追蹤的結果是發現如果不聲明replace,好像就不會執行ngTransclude指令,這點我很奇怪,正因為這樣子所以導致沒有成功渲染。二歸根結底其實是兩者的操作的DOM元素不同,在聲明transclude為element時,replace為true,你取到的DOM節點是含有transclude屬性的節點(子節點),而為false你拿到的并不是含有transclude屬性的節點(父節點),而ng本身不對其節點進行遍歷,導致沒能執行ngTransclude指令

  我看到一個觀點覺得不錯,大概意思就是:源于功能的考慮,在使用element屬性的時候,一般都是起占位符的作用,你需要做的操作是對DOM的添加時候,才會用到這個克隆功能。

  我覺得這個觀點不錯,看過很多關于ngrepeat的介紹,很多文章都說ngrepeat源碼是通過$scope.$new()來生成子作用域的,實際上并不完全正確,他的確是通過$scope.$new產生子作用域的,但是這個產生功能是交給$transclude函數去做得,實際上ngrepeat的源碼上是通過$transclude來生成子作用域和添加DOM節點的。與上面的觀點有相似之處。

  就講到這里了,這是作者原創,轉載請注明

轉載于:https://www.cnblogs.com/HeJason/p/5514690.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457882.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設備模型2

前言 在上一篇中&#xff0c;我們大致描述了LINUX設備模型&#xff0c;我們先來總結一下三要素的關系。 從圖中可以看出,Linux設備模型就是"總線、設備、驅動、類"這四個概念之前的相互關系;這也是Linux2.6內核抽象出來的用于管理系統中所有設備的模型圖; 簡單地描述…

angular自定義指令詳解

指令&#xff08;directive&#xff09;是angular里面最核心也是最難懂的東西&#xff0c;在慕課網看了下大漠窮秋老濕的視頻&#xff0c;自己百度半天做了一些小test&#xff0c;總算把一切都搞明白了。 先列出學習來源&#xff1a; 指令中controller和link的區別&#xff1a;…

delphi7aes加密解密與java互轉_跨語言(java vs python vs nodejs)的RSA加解密問題探討

多次被問到這樣的問題&#xff1a;java服務端的rsa加密操作已經完成&#xff0c;返回一個16進制的字符串給python平臺&#xff0c;但是在python進行私鑰解密的時候發現行不通。。。。前端python加密&#xff0c;后端用java解密&#xff0c;解不出來還有諸如nodejs從理論上來說&…

類的定義、成員定義修飾符

類的定義 修飾符含義1無或internal 只能在當前項目中訪問類&#xff0c;其它項目引用后也無法訪問2public 可以任何地方訪問類3abstract 不能實例化&#xff0c;只能供繼承之用4sealed 不能供派生之用&#xff0c;只能實例化5internal abstract136public abstract237intern…

設備模型3

在上一篇分析中&#xff0c;多次提到了SYSFS&#xff0c;這是個什么東西&#xff1f;這可是個很大的TOPIC&#xff0c;關于它的講述可以寫本書&#xff0c;但是我們暫時的目標不是要完全啃投它所有的東西&#xff0c;沒時間&#xff0c;沒精力&#xff0c;我們只要掌握我們需要…

浪潮之巔讀后感

這幾天看到一本非常好的書《浪潮之巔》。浪潮&#xff0c;指的是時代的大潮。而浪潮之巔&#xff0c;顧名思義就是指站在時代潮流的巔峰&#xff0c;引領時代潮流&#xff0c;扛起發展大旗。而本書就是在介紹各大處在浪潮之巔的IT公司的歷史及發展。 書中有句話說得好&#xff…

利用dft的定義計算dft的matlab程序_CP2K教程系列之靜態計算(Pymatflow篇)

本系列CP2K教程是《CP2K菜根譚》的升級版&#xff0c;在舊版基礎上添加了如何結合Pymatflow工具簡化計算流程的內容。話不多說&#xff0c;本文將為您帶來CP2K系列教程中的靜態計算部分。靜態計算設置靜態計算是大多數人接觸第一性原理計算后第一次運行的計算類型。很多其它類型…

機器學習:最大似然估計與最大后驗概率估計

在機器學習領域&#xff0c;概率估計是經常用到的一種模型&#xff0c;而概率估計中&#xff0c;我們經常會看到兩種估計模型&#xff0c;一種是最大似然估計&#xff0c;即 Maximum likelihood&#xff0c; 另外一種就是最大后驗概率估計&#xff0c;即 Maximum posterior &am…

ubuntu14.04安裝git

參考教程&#xff1a;git介紹&#xff1a;安裝&#xff0c;使用&#xff0c;創建分支 安裝的方法有兩種&#xff0c;一種直接是通過ubuntu的APT安裝&#xff0c;這種方法最簡便&#xff0c;缺點是版本可能不是最新的。所有還有另一種方法是下載源碼進行安裝&#xff0c;這種能…

微軟是如何戲耍程序員們的

2019獨角獸企業重金招聘Python工程師標準>>> 別用微軟的東西。商業目的性太強&#xff0c;千萬別被微軟牽著鼻子走&#xff0c;血淋淋的教訓。微軟推出的垃圾多了去了。它什么都想做&#xff0c;很多都沒做好&#xff1a; MFC&#xff1a;Win31時代出生&#xff0c;…

3d立體相冊特效html網頁代碼_新聞類網頁正文通用抽取器

項目起源開發這個項目&#xff0c;源自于我在知網發現了一篇關于自動化抽取新聞類網站正文的算法論文——《基于文本及符號密度的網頁正文提取方法》這篇論文中描述的算法看起來簡潔清晰&#xff0c;并且符合邏輯。但由于論文中只講了算法原理&#xff0c;并沒有具體的語言實現…

ubuntu14.04安裝 R16 Tina Linux SDK

第一步&#xff1a;由于是14.04系統所以這樣$sudo -i $cd /etc/apt/sources.list.d $echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" > ia32-libs-raring.list $apt-get update $apt-get install ia32-libs $r…

分答

用戶在分答上可以自我介紹或描述擅長的領域&#xff0c;設置付費問答的價格&#xff0c;其他用戶感興趣就可以付費向其提問。分答的收入分配機制增加了信息的價值&#xff0c;分答中信息接收者被區分成了兩種身份。首先提問的人是一種付費懸賞模式&#xff0c;當回答完畢內容沉…

字節數組轉換為圖片_每日一課 | Python 3 TypeError:無法將“字節”對象隱式轉換為str...

將Python 2套接字示例轉換為Python 3whois.py import sysimport sockets socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(("whois.arin.net", 43))s.send((sys.argv[1] "\r\n").encode())response ""while True: data s.re…

php版redis插件,SSDB數據庫,增強型的Redis管理api實例

php版redis插件,SSDB數據庫,增強型的Redis管理api實例 SSDB是一套基于LevelDB存儲引擎的非關系型數據庫&#xff08;NOSQL&#xff09;&#xff0c;可用于取代Redis&#xff0c;更適合海量數據的存儲。另外&#xff0c;rocksdb是FB在LevelDB的二次開發版本&#xff0c;因此也存…

加速度計和陀螺儀數據融合

本帖翻譯自 IMU&#xff08;加速度計和陀螺儀設備&#xff09;在嵌入式應用中使用的指南。這篇文章主要介紹加速度計和陀螺儀的數學模型和基本算法&#xff0c;以及如何融合這兩者&#xff0c;側重算法、思想的討論介紹本指南旨在向興趣者介紹慣性MEMS&#xff08;微機電系統&a…

循環嵌套練習題

//BOSS://讓用戶輸入一個奇數&#xff0c;打印菱形&#xff0c;最長的行內容個數為用戶輸入的個數&#xff0c;并且由英文字母拼接而成//比如用戶輸入了7// A// ABA// ABCBA// ABCDCBA// ABCBA// ABA// A//1、接收并判斷用戶輸入的是不是數字 try{#region 解法一…

python leetcode_leetcode 介紹和 python 數據結構與算法學習資料

for &#xff08;剛入門的編程&#xff09;的高中 or 大學生leetcode 介紹leetcode 可以說是 cs 最核心的一門“課程”了&#xff0c;雖然不是大學開設的&#xff0c;但基本上每一個現代的高水平的程序員都修過這門“課程”&#xff08;或者類似的課程&#xff0c;比如數據結構…

平衡小車卡爾曼濾波算法

最近研究STM32的自平衡小車&#xff0c;發現有兩座必過的大山&#xff0c;一為卡爾曼濾波&#xff0c;二為PID算法。 網上看了很多關于卡爾曼濾波的代碼&#xff0c;感覺寫得真不咋地。一怒之下&#xff0c;自己重寫&#xff0c;不廢話&#xff0c;貼代碼 [pre lang"C&quo…

IOS 為UILabel添加長按復制功能

IOS 為UILabel添加長按復制功能 在iOS中下面三個控件&#xff0c;自身就有復制-粘貼的功能&#xff1a; 1、UITextView 2、UITextField 3、UIWebView UIKit framework提供了幾個類和協議方便我們在自己的應用程序中實現剪貼板的功能。 1、UIPasteboard&#xff1a;我們可以向其…