用angularjs實現能夠可修改的下拉菜單

這個是在前端開發群里的時候,看到有人想實現一個下拉菜單,并且要實現選項能夠修改,當時我覺得應該用angular實現比較簡單,最開始想到的是ng-options發現,只能夠實現下拉,但是不能夠實現點擊修改選擇,因為ng-options中是自動生成下拉菜單的,不能夠修改,所有我用div span模擬了一個下拉菜單,想了兩種方法,第一種是jquery的思想,點擊span生成一個input元素,獲取數據,然后消失把數據傳遞給span,但是經過試驗,只能夠實現一次,這樣不是很好,我認為應該是dom的改動,影響到了指令中link函數中的element元素,不能夠正常工作,所以有想了第二種,這個就完美實現了(沒有太刻意寫CSS比較丑,但是功能都有),同時有span和input這樣靠class類名來控制位置,效果,消除和隱藏,這樣就避免了第一種情況,下面是效果圖。
第一張是沒有修改的


1.JPG

第二張是正在修改的效果


2.JPG

第三張是修改后效果
3.JPG

最后上代碼吧,然后我把里面的知識點說一下,

<!DOCTYPE html>
<html lang="en" ng-app="selectAPP">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="lib/angular.min.js" type="text/javascript"></script>
    <script src="lib/jquery-2.1.4.min.js" type="text/javascript"></script>
    <script src="lib/bootstrap.js" type="text/javascript"></script>
    <link rel="stylesheet" href="css/bootstrap.css"/>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            position: relative;
            left: 200px;
            top: 50px;
            border: 1px solid blue;
            height: 400px;
            width: 500px;
        }
        .box p{
            position: absolute;
            left: 0;
            top: 0;
            display: block;
            height: 20px;
            width: 200px;
            background: seagreen;
        }
        .box .content {
            position: absolute;
            top: 20px;
        }
        .box .content div{
            background: #5265eb;
            width: 200px;
            height: 30px;
            border:1px solid greenyellow;
        }
        .box .content div span{
            background: skyblue;
            width: 200px;
            height: 30px;
            display: block;
        }
        .show{
            display: block;
        }
        .hide{
            display:none;
        }
    </style>
</head>
<body >
   <div ng-controller="selectController">
      <div class="box">
          <p ng-click="flag=!flag">content</p>
          <div class="content" ng-class="{true:'show',false:'hide'}[flag]" >
              <div><my-directive ></my-directive></div>
              <!--<span>one</span>
              <span>two</span>
              <span>three</span>-->
          </div>
          <h1 style="position: absolute;top:120px ">{{message}}</h1>
      </div>
   </div>

    <div ng-controller="selectController2">
        <div class="box">
            <p ng-click="flag=!flag">content</p>
            <div class="content" ng-class="{true:'show',false:'hide'}[flag]">
                <my-directive2></my-directive2>
            </div>
        </div>
    </div>


</body>
<script>
    var app=angular.module('selectAPP',[]);
    app.controller('selectController', function ($scope) {
       $scope.flag=false;
    });
    app.directive('myDirective',['$compile',function ($compile){
        return{
            restrict:'EA',
            replace:true,
            template:' <span ng-model="message">12</span>',
            link: function (scope,element,attr) {
                var div=element.parent();
                element.on('dblclick', function () {
                    var input=angular.element('<input type="text" ng-model="message" />');
                    var inputafter=$compile(input)(scope);
                    var span=angular.element('<span ng-model="message"></span>');
                    var spanafter=$compile(span)(scope);
                    div.append(inputafter);
                    element.remove();
                    setTimeout(function (){
                        div.find('input').remove();
                        div.append(spanafter).find('span').html(scope.message);
                    },4000);
                });
            }
        }
    }]);

    app.controller('selectController2',['$scope', function ($scope) {
        $scope.flag=false;
    }]);
    app.directive('myDirective2', function () {
        return{
            restrict:'EA',
            replace:true,
            template:'<div ><span>{{message}}</span> <input type="text" ng-model="message"></div>',
            link: function (scope,element,attr) {
                scope.message="one";
                element.find('input').addClass('hide');
                element.find('span').on('dblclick', function () {
                    element.find('span').removeClass('show').addClass('hide');
                    element.find('input').removeClass('hide').addClass('show');
                });
                element.find('input').on('blur', function () {
                    element.find('input').removeClass('show').addClass('hide');
                    element.find('span').removeClass('hide').addClass('show');
                })
            }
        }
    })

</script>
</html>

大家用的比較少的可能是$compile這個有兩個用途,一個是生成angular的DOM元素的服務,并且連接scope的數據,如果不使用那就不連接數據,只是一個angularDOM,這需要傳入當前scope,另外一個就是在指令中用來替代link函數的編譯函數,這個網上資料都有,可以搜一下,或者改天我寫一下。
angular.element這個的意思是包裹成angular元素。連接數據之前的angularDOM;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容