亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

AngularJS動態菜單操作指令

2019-11-19 16:44:07
字體:
來源:轉載
供稿:網友

前言    

    在我們創建一個angularJS應用的時候,菜單往往往是不可或缺的元素之一。也許在我們靜態菜單的時候不會發現在指令中操作菜單收縮、折疊展開沒有任何問題,因為我們在操作之前,頁面元素渲染已經完成,所以在指令里面通過element查找目標元素可以成功。但是一旦我們的菜單的數據不是靜態而是通過后臺接口加載動態數據渲染,我們會發現本來在靜態寫好的指令操作,在轉變為動態數據加載之后,怎么也沒法查找到想要的目標元素。

    遇到如此問題,開始覺得好奇葩的,當然這也是吐槽一下,還是得好好解決問題的,痛定失痛,決心好好理清思路,分析一下問題原因。首先我們先了解一下AngularJS的生命周期。

AngularJS的生命周期

    在AngularJS應用啟動前,它們會以HTML文本的形式保存在文本編輯器中。應用啟動后會進行編譯和鏈接,作用域會同HTML進行綁定,應用可以對用戶在HTML中進行的操作進行實時響應。AngularJS的生命周期主要有兩個主要階段:一個是編譯階段,一個是鏈接階段。

AngularJS生命周期-編譯階段

    在編譯階段,AngularJS會遍歷整個HTML文檔并根據JavaScript中的指令定義來處理頁面上聲明的指令。每一個指令模板中可能有另一個指令,另一個指令也有可能會有自己的模板。AngularJS調用HTML文檔根部的指令時,會遍歷其中所有的模板,模板中可能含有模板的指令。如果一個元素已經有一個含有模板的指令,永遠不要對其用另一個指令進行修飾,只有最高優先級的指令中的模板會被編譯。

    一旦對指令和其中的子模板進行遍歷或編譯,編譯后的模板會返回一個叫做模板函數的函數。在這個時候的DOM樹還沒有進行數據綁定,此時對DOM樹操作只會有很少的性能開銷,ng-repeat和ng-transclude等內置指令會在這個時候對還未進行數據綁定的DOM進行操作。比如ng-repeat,它會遍歷指定的數組或對象,在數據綁定之前構建對應的DOM結構,然后將新的DOM(編譯后的DOM)傳遞給指令生命周期中的下一階段,鏈接階段。一個指令的DOM一旦編譯完成,就可以立即通過編譯函數對其進行訪問,編譯函數的簽名包含有訪問指令聲明所在的元素(tElements)及該元素對其他屬性(tAttrs)的方法。

    compile返回對象或函數,compile()函數負責對模板DOM進行轉換,link()函數負責將作用域和DOM進行轉換。

//...compile: function(tEle,tAttrs,transcludeFn){ var tplEl = angular.element('<div>' +'<h2></h2>'+'</div>'); var h2 = tplEl.find('h2'); h2.attr('type',tAttrs.type); h2.attr('ng-model',tAttrs.ngModel); h2.val('hello'); tEle.replaceWith(tplEl); return function(scope, ele, attrs){  //連接函數 };}//...

 AngularJS生命周期-鏈接階段

    link函數創建可以操作DOM的指令,鏈接函數是可選的。定義了編譯函數,返回鏈接函數,當兩個函數都定義了,編譯函數會重載鏈接函數。

//下面2種定義指令的放松在功能上是完全一樣的angular.module('myApp',[]).directive('myDirective', function (){ return { pre: function (tElement, tAttrs, transclude){ //在子元素被鏈接之前執行,之后調用‘link'函數無法定位鏈接的元素  }, post: function (scope, iElement, iAttrs, controllers){   //在子元素被鏈接之后執行 } }});
angular.module('myApp',[]).directive('myDirective', function (){ return { link: function (scope, ele, attrs){  return {  pre: function (tElement, tAttrs, transclude){  //在子元素被鏈接之前執行,之后調用‘link'函數無法定位鏈接的元素  },  post: function (scope, iElement, iAttrs, controllers){    //在子元素被鏈接之后執行  }  } } }});

    當定義了編譯函數來取代鏈接函數時,鏈接函數使我們能提供給返回對象的第二個方法,也就是postLink函數。鏈接函數會在模板編譯并同作用域進行鏈接后被調用,它負責設置事件監聽器,監聽數據變化和實時的操作DOM。

//鏈接函數簽名link: function(scope, element, attrs){ //操作DOM}//含require選項, require someContainerlink: function(scope, element, attrs, someContainer){ //在這里操作DOM,可以訪問require指定的控制器}
  • scope--指令用來在其內部注冊監聽器的作用域;
  • element--參數代表實例元素,指使用此指令的元素;
  • atrrs--代表實例屬性,是一個由定義在元素上的屬性組成的標準化列表,可以在所有指令的鏈接函數間共享,會以javascript對象的形式進行傳遞;
  • controller 參數指向require選項定義的控制器。沒有設置require選項,controller的參數為undefined;

    控制器在所有的指令間共享,因此指令可以將控制器當作通信通道(公共API),如果設置多個require,這個參數是一個控制器實例組成的數組,而不是一個單獨的控制器。

問題剖析

    在通過對AngularJS生命周期的理解,我們可以清晰地認識到動態菜單為什么綁定在鏈接階段上的DOM操作沒有成功,由于ng-repeat的原因,我對DOM樹操作沒找到DOM元素。因為在封裝成一個菜單指令組件的時候,我內部的菜單數據加載使用ng-repeat實現,所以只有在這個時候才能在ng-repeat內部綁定對DOM樹的操作。

    最初的寫法:

//html <menu-bar>`````<div ng-repeat="ml in menuLists"> `````` <div ng-repeat="mls in ml.secondLists"> `````` <div ng-repeat="mlt in mls.thirdLists"> `````` </div> `````` </div> ``````</div>``````</menu-bar>//directiveangular.module('',[]).directive('menuBar',function (){ return { restrict: 'E', replace: true, link: function (scope, element, attr){ //操作菜單的邏輯代碼 } }});

    這種寫法,在link里面操作菜單邏輯的代碼沒有被觸發,尼瑪,angularjs的檢測機制也沒用,因為ng-repeat的原因導致DOM操作事件沒有被掛載到DOM上,所以想操作菜單不可能成功。但是,如果ng-repeat的內容是靜態存在的,link函數里面的操作是可以實現的。

    修改后的寫法:

//html <div ng-repeat="ml in menuLists"> `````` <div ng-repeat="mls in ml.secondLists"> `````` <menu-bar> `````` <div ng-repeat="mlt in mls.thirdLists"> `````` <menu-bar>  `````` </menu-bar> `````` </div> `````` </menu-bar> `````` </div> ``````</div>//directiveangular.module('',[]).directive('menuBar',function (){ return { restrict: 'E', replace: true, link: function (scope, element, attr){ //操作菜單的邏輯代碼 } }});

    修改之后我們將我們操作動態加載的DOM結構的指令放入ng-repeat中,此時邏輯正常執行,在link函數中能打印出DOM結構。

以上所述是小編給大家介紹的AngularJS動態菜單操作指令,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品美女久久久久| 66m—66摸成人免费视频| 日韩精品免费电影| 色yeye香蕉凹凸一区二区av| 亚洲国内高清视频| 久久亚洲精品毛片| 亚洲成人999| 国产精品一区久久久| 亚洲日韩中文字幕在线播放| 久久精品精品电影网| 黄色成人av网| 国产美女直播视频一区| xxx欧美精品| 亚洲2020天天堂在线观看| 国外成人在线播放| 国产精品热视频| 国产亚洲一区精品| 美日韩精品免费视频| 国产自产女人91一区在线观看| 国产亚洲精品一区二555| 亚洲欧美中文日韩在线| 国产精品精品久久久| 久久久国产精品免费| 国产91精品黑色丝袜高跟鞋| 色综合久久天天综线观看| 国产精品视频最多的网站| 精品久久久久久久久久国产| 国产精品精品久久久| 欧美日韩第一页| 亚洲欧美日韩在线高清直播| 亚洲人免费视频| 97免费中文视频在线观看| 久久大大胆人体| 亚洲美女av黄| 欧美国产欧美亚洲国产日韩mv天天看完整| 精品国产91久久久久久老师| 欧美成人精品h版在线观看| 日韩欧美国产骚| 亚洲伊人一本大道中文字幕| 亚洲第一精品夜夜躁人人爽| 亚洲精品不卡在线| 97人人模人人爽人人喊中文字| 亚洲人成77777在线观看网| 精品视频久久久| 亚洲色图35p| 国产视频精品在线| 懂色av中文一区二区三区天美| 日韩精品免费在线| 色综合久久88色综合天天看泰| 日韩电影免费在线观看中文字幕| 尤物tv国产一区| 精品电影在线观看| 91av视频在线| 中文字幕在线成人| 欧美午夜片欧美片在线观看| 日韩久久精品电影| 日韩在线一区二区三区免费视频| 美乳少妇欧美精品| 奇米4444一区二区三区| 欧美精品videosex极品1| 热99精品里视频精品| 欧美精品在线播放| 国产精品三级在线| 国内免费久久久久久久久久久| 亚洲欧洲在线播放| 亚洲r级在线观看| 国产午夜精品理论片a级探花| 日韩亚洲欧美中文高清在线| 久久五月天综合| 中文字幕综合一区| 中文字幕在线国产精品| 亚洲天堂日韩电影| 成人精品一区二区三区| 日韩欧美成人区| 亚洲欧美日韩视频一区| 色偷偷888欧美精品久久久| 国内精久久久久久久久久人| 日韩国产高清视频在线| 亚洲天堂成人在线视频| 欧美专区第一页| 日韩视频一区在线| 亚洲国产天堂久久综合网| 亚洲欧美日韩精品| 91av在线看| 成人免费看吃奶视频网站| 久久精品国产69国产精品亚洲| 夜夜狂射影院欧美极品| 国产精品香蕉国产| 26uuu日韩精品一区二区| 中文字幕亚洲第一| 国产情人节一区| 日韩av高清不卡| 国产在线精品一区免费香蕉| 韩国欧美亚洲国产| 成人欧美一区二区三区黑人孕妇| 欧美在线亚洲一区| 日本不卡高字幕在线2019| 欧美一区二区三区艳史| 国产ts人妖一区二区三区| 亚洲肉体裸体xxxx137| 国产精品久久在线观看| 亚洲视频免费一区| 久久99青青精品免费观看| xxx成人少妇69| 中文字幕日韩av电影| 亚洲国产精久久久久久久| 亚洲精品wwwww| 在线日韩日本国产亚洲| 国产精品视频在线观看| 中文字幕在线观看亚洲| 91亚洲va在线va天堂va国| 国产精品日韩在线观看| 亚洲国产日韩欧美综合久久| 成人黄色片网站| xxxxxxxxx欧美| 91高清在线免费观看| 国产区精品在线观看| 日本视频久久久| 97久久精品人搡人人玩| 亚洲高清久久网| 国产a级全部精品| 日韩欧美在线播放| 成人激情视频网| 亚洲国产精品专区久久| 亚洲欧洲国产一区| 黄网站色欧美视频| 久久久精品久久久久| 欧美精品性视频| 岛国av一区二区| 欧美性理论片在线观看片免费| 青青草99啪国产免费| 神马国产精品影院av| 亚洲品质视频自拍网| 性欧美在线看片a免费观看| 97成人精品视频在线观看| 欧美裸体男粗大视频在线观看| 国产美女久久精品| 国产精品永久在线| 日韩av电影在线网| 国产精品尤物福利片在线观看| 日韩在线免费视频| 日韩福利视频在线观看| 欧美一级黑人aaaaaaa做受| 亚洲成人久久电影| 久久亚洲春色中文字幕| 久久久久久亚洲精品不卡| 亚洲大胆人体视频| 国产精品一区久久久| 日韩成人在线免费观看| 成人免费在线网址| 国产亚洲成精品久久| 97视频在线免费观看| 亚洲欧洲第一视频| 91精品国产综合久久久久久久久| 日韩大陆毛片av| 红桃av永久久久| 欧美综合一区第一页| 亚洲免费成人av电影| 精品欧美激情精品一区| 国产精品观看在线亚洲人成网| 亚洲午夜国产成人av电影男同| 一区二区三区日韩在线| 日日骚久久av| 不卡在线观看电视剧完整版|