angular-ui-bootstrap中的Collapse 指令源碼解析

源碼先放在這里薄啥,以后來補充撞反,大部分注釋寫了鸦列,很好明白租冠。

/*
 * angular-ui-bootstrap
 * http://angular-ui.github.io/bootstrap/

 * Version: 1.2.4 - 2016-03-06
 * License: MIT
 */angular.module("ui.bootstrap", ["ui.bootstrap.tpls","ui.bootstrap.collapse"]);
angular.module("ui.bootstrap.tpls", []);
angular.module('ui.bootstrap.collapse', [])

  .directive('uibCollapse', ['$animate', '$q', '$parse', '$injector', function($animate, $q, $parse, $injector) {
    var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;
    return {
      link: function(scope, element, attrs) {
        var expandingExpr = $parse(attrs.expanding),//假如指令屬性中有expanding方法,則用$attr獲取
            expandedExpr = $parse(attrs.expanded),//假如屬性中有expanded方法薯嗤,則用$attr獲取
            collapsingExpr = $parse(attrs.collapsing),//假如屬性中有collapsingExpr方法顽爹,則用$attr獲取
            collapsedExpr = $parse(attrs.collapsed);//假如屬性中有collapsedExpr方法,則用$attr獲取
//$parse和$eval都是解析字符串骆姐,區(qū)別是$parse是作為單獨的一個服務存在镜粤,$eval是作為單獨的一個scope方法來使用的
        if (!scope.$eval(attrs.uibCollapse)) {//如果uib-collapse為false的話,就為元素添加如下樣式和屬性
          element.addClass('in')
            .addClass('collapse')
            .attr('aria-expanded', true)
            .attr('aria-hidden', false)
            .css({height: 'auto'});
        }
//展開方法玻褪,由shouldCollapse負責監(jiān)聽肉渴,并且通過$q來達到展開折疊前后事件發(fā)生的控制
        function expand() {
          if (element.hasClass('collapse') && element.hasClass('in')) { //如果已經是展開的就返回
            return;
          }
//查到的資料顯示 resolve是$q.deffer()的方法,不知這里為什么$q怎么回事带射。
          $q.resolve(expandingExpr(scope))//成功執(zhí)行的信息黄虱,傳遞下去
            .then(function() {
              element.removeClass('collapse')
                .addClass('collapsing')
                .attr('aria-expanded', true)
                .attr('aria-hidden', false);

              if ($animateCss) {
                $animateCss(element, {
                  addClass: 'in',
                  easing: 'ease',
                  to: { height: element[0].scrollHeight + 'px' }
                }).start()['finally'](expandDone);
              } else {
                $animate.addClass(element, 'in', {
                  to: { height: element[0].scrollHeight + 'px' }
                }).then(expandDone);
              }
            });
        }

        function expandDone() {
          element.removeClass('collapsing')
            .addClass('collapse')
            .css({height: 'auto'});
          expandedExpr(scope);
        }

        function collapse() {
          if (!element.hasClass('collapse') && !element.hasClass('in')) {
            return collapseDone();
          }

          $q.resolve(collapsingExpr(scope))
            .then(function() {
              element
                // IMPORTANT: The height must be set before adding "collapsing" class.
                // Otherwise, the browser attempts to animate from height 0 (in
                // collapsing class) to the given height here.
                .css({height: element[0].scrollHeight + 'px'})
                // initially all panel collapse have the collapse class, this removal
                // prevents the animation from jumping to collapsed state
                .removeClass('collapse')
                .addClass('collapsing')
                .attr('aria-expanded', false)
                .attr('aria-hidden', true);

              if ($animateCss) {
                $animateCss(element, {
                  removeClass: 'in',
                  to: {height: '0'}
                }).start()['finally'](collapseDone);
              } else {
                $animate.removeClass(element, 'in', {
                  to: {height: '0'}
                }).then(collapseDone);
              }
            });
        }

        function collapseDone() {
          element.css({height: '0'}); // Required so that collapse works when animation is disabled
          element.removeClass('collapsing')
            .addClass('collapse');
          collapsedExpr(scope);
        }
//監(jiān)聽展開折疊變化
        scope.$watch(attrs.uibCollapse, function(shouldCollapse) {
          if (shouldCollapse) {
            collapse();
          } else {
            expand();
          }
        });
      }
    };
  }]);


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市庸诱,隨后出現的幾起案子捻浦,更是在濱河造成了極大的恐慌,老刑警劉巖桥爽,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朱灿,死亡現場離奇詭異,居然都是意外死亡钠四,警方通過查閱死者的電腦和手機盗扒,發(fā)現死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀去,“玉大人侣灶,你說我怎么就攤上這事÷扑椋” “怎么了褥影?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咏雌。 經常有香客問我凡怎,道長,這世上最難降的妖魔是什么赊抖? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任统倒,我火速辦了婚禮,結果婚禮上氛雪,老公的妹妹穿的比我還像新娘房匆。我一直安慰自己,他們只是感情好报亩,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布浴鸿。 她就那樣靜靜地躺著,像睡著了一般捆昏。 火紅的嫁衣襯著肌膚如雪赚楚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天骗卜,我揣著相機與錄音宠页,去河邊找鬼。 笑死寇仓,一個胖子當著我的面吹牛举户,可吹牛的內容都是我干的。 我是一名探鬼主播遍烦,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼俭嘁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了服猪?” 一聲冷哼從身側響起供填,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拐云,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后近她,有當地人在樹林里發(fā)現了一具尸體叉瘩,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年粘捎,在試婚紗的時候發(fā)現自己被綠了薇缅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒磨,死狀恐怖泳桦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情娩缰,我是刑警寧澤灸撰,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站漆羔,受9級特大地震影響梧奢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜演痒,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一亲轨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸟顺,春花似錦惦蚊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欧芽,卻和暖如春莉掂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背千扔。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工憎妙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曲楚。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓厘唾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親龙誊。 傳聞我的和親對象是個殘疾皇子抚垃,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容