ng-directive-選擇資料

神牛003發表於2016-04-19

  本文是用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

 

相關文章