本文是用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 });
上面使用的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