文章出處

  本文是用angularjs指令寫的一個簡易數據選擇功能,其實就是兩個下拉框,把兩邊的數據相互交換而已,這樣的功能最早應該是用jquery寫過,但移動端js框架angularjs如果還嵌套jquery來寫效果,這樣就顯的沒有可用性了,并且在前不久QQ討論群里面也有人問題這樣的功能用ng怎么實現,在這就順便發上一篇吧,勿噴,界面如下:

  思路分析:

    1.單選或多選這左邊的數據,左邊選擇的數據就移除變動到后面的選擇框中,后面選擇框的功能反過來也是一樣的;

    2.看起來這兩個選擇框的功能是一模一樣的,沒錯這里關鍵的問題就在于這兩個框之前必須保持的關系,因為復雜的業務界面通常有多個選擇框,這樣就必須要知道那兩個框是對應的,這里使用的是插件Id來保持關系

  代碼:

    功能主要分為兩個方法,選擇左邊數據時候的處理方法和右邊數據的處理方法如下:

  1     var myTest = angular.module("myTest", []);
  2 
  3     myTest.directive("selremove", function () {
  4 
  5         return {
  6 
  7             restrict: 'ECMA',
  8             scope: {
  9                 getOpitems: '&',
 10                 id: '@id'
 11             },
 12             template: '<table>' +
 13                             '<tr>' +
 14                                 '<td>' +
 15                                      '<select  id="{{id}}01" multiple ng-click="NextFun()" ng-options="option.name for option in data.opItems track by option.val" ng-model="data.selectedOption"></select>' +
 16                                 '</td>' +
 17                                 '<td>' +
 18                                     '<select  id="{{id}}02" multiple ng-click="PrevFun()"  ng-options="option.name for option in data.selectedAllOption track by option.val" ng-model="data.selectedOption">' +
 19                                     '</select>' +
 20                                 '</td>' +
 21                              '</tr>' +
 22                        '</table>',
 23             controller: function ($scope) {
 24 
 25                 $scope.data = {
 26                     opItems: $scope.getOpitems(),
 27                     selectedOption: [],
 28                     selectedAllOption: []
 29                 };
 30 
 31                 //右移
 32                 $scope.NextFun = function () {
 33                     console.log("NextFun");
 34                     var selOption = $scope.data.selectedOption;  //使用的是自帶的選擇option
 35                     for (var i in selOption) {
 36 
 37                         var item = selOption[i];
 38                         for (var ii in $scope.data.opItems) {
 39 
 40                             var item01 = $scope.data.opItems[ii];
 41                             if (item01.val != item.val || !angular.isObject(item01)) { continue; }
 42 
 43                             //添加到最終選中框
 44                            // console.log("next:" + item01.val);
 45                             $scope.data.selectedAllOption.push(item01);
 46                             //移除opItems數據
 47                             $scope.data.opItems.splice(ii, 1);
 48                             break;
 49                         }
 50                     }
 51                 }
 52 
 53                 //左移
 54                 $scope.PrevFun = function () {
 55 
 56                     console.log("PrevFun");
 57                     var selOption = $scope.data.selectedOption;
 58 
 59                     for (var i in selOption) {
 60 
 61                         var item01 = selOption[i];
 62                         for (var ii in $scope.data.selectedAllOption) {
 63 
 64                             var item = $scope.data.selectedAllOption[ii];
 65                            // console.log(item01.val + "|" + item.val + "|" + ii);
 66                             if (item01.val != item.val || !angular.isObject(item)) { continue; }
 67 
 68                             //添加到原始集合
 69                             $scope.data.opItems.push(item);
 70                             //移除selectedAllOption數據
 71                             $scope.data.selectedAllOption.splice(ii, 1);
 72                             break;
 73                         }
 74                     }
 75                 }
 76             }
 77         }
 78     });
 79 
 80     myTest.controller("OpCtrl", function ($scope) {
 81 
 82         $scope.OpItems = [
 83             {
 84                 name: "蘋果",
 85                 val: "1"
 86             },
 87             {
 88                 name: "橘子",
 89                 val: "2"
 90             },
 91             {
 92                 name: "番茄",
 93                 val: "3"
 94             },
 95             {
 96                 name: "香蕉",
 97                 val: "4"
 98             },
 99             {
100                 name: "汽車",
101                 val: "5"
102             },
103             {
104                 name: "作業",
105                 val: "6"
106             },
107             {
108                 name: "工資",
109                 val: "7"
110             },
111             {
112                 name: "游戲",
113                 val: "8"
114             },
115             {
116                 name: "沖浪",
117                 val: "9"
118             }
119         ];
120     });
View Code

  上面使用的ng指令的規范,就不用說了,必須要按照ng規則來寫指令,想說的是這段代碼-ng-options="option.name for option in data.opItems track by option.val"使用了ng自帶的數據展示方式,類似于for循環遍歷數據;

  上面的代碼是封裝了一個ng指令,然后在頁面上只需要一句代碼如:<selremove id="sel" get-opitems="OpItems"></selremove> 這樣就能把兩個選擇框展示出來,功能實現;

  這功能簡單沒有什么說的也沒用到什么nb的技術,關鍵想強調的是ng的規范性,web界面效果實現起來的簡單分析,勿噴。

  效果的展示地址:http://7xn3fx.com1.z0.glb.clouddn.com/左右選擇數據.html

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()