AngularJS遞迴指令實現Tree View效果樣本_AngularJS

來源:互聯網
上載者:User

本文執行個體講述了AngularJS遞迴指令實現Tree View效果的方法。分享給大家供大家參考,具體如下:

在層次資料結構展示中,樹是一種極其常見的展現方式。比如系統中目錄結構、企業組織圖、電子商務產品分類都是常見的樹形結構資料。

這裡我們採用Angular的方式來實現這類常見的tree view結構。

首先我們定義資料結構,採用以children屬性來掛接子節點方式來展現樹階層,樣本如下:

[  {   "id":"1",   "pid":"0",   "name":"家用電器",   "children":[     {      "id":"4",      "pid":"1",      "name":"大家電"     }   ]  },  {   ...  }  ...]

則我們對於ng way的tree view可以實現為:

JavaScript:

angular.module('ng.demo', []).directive('treeView',[function(){   return {     restrict: 'E',     templateUrl: '/treeView.html',     scope: {       treeData: '=',       canChecked: '=',       textField: '@',       itemClicked: '&',       itemCheckedChanged: '&',       itemTemplateUrl: '@'     },     controller:['$scope', function($scope){       $scope.itemExpended = function(item, $event){         item.$$isExpend = ! item.$$isExpend;         $event.stopPropagation();       };       $scope.getItemIcon = function(item){         var isLeaf = $scope.isLeaf(item);         if(isLeaf){           return 'fa fa-leaf';         }         return item.$$isExpend ? 'fa fa-minus': 'fa fa-plus';       };       $scope.isLeaf = function(item){        return !item.children || !item.children.length;       };       $scope.warpCallback = function(callback, item, $event){         ($scope[callback] || angular.noop)({           $item:item,           $event:$event         });       };     }]   }; }]);

HTML:

樹內容主題HTML: /treeView.html

<ul class="tree-view">    <li ng-repeat="item in treeData" ng-include="'/treeItem.html'" ></li></ul>

每個item節點的HTML:/treeItem.html

<i ng-click="itemExpended(item, $event);" class=""></i><input type="checkbox" ng-model="item.$$isChecked" class="check-box" ng-if="canChecked" ng-change="warpCallback('itemCheckedChanged', item, $event)"><span class='text-field' ng-click="warpCallback('itemClicked', item, $event);"></span><ul ng-if="!isLeaf(item)" ng-show="item.$$isExpend">  <li ng-repeat="item in item.children" ng-include="'/treeItem.html'">  </li></ul>

這裡的技巧在於利用ng-include來載入子節點和資料,以及利用一個warpCallback方法來轉接函數外部回呼函數,利用angular.noop的Null 物件模式來避免未註冊的回調情境。對於View互動的資料隔離採用了直接封裝在中繼資料對象的方式,但它們都以$$開頭,如$$isChecked、$$isExpend。在Angular程式中以$$開頭的對象會被認為是內部的私人變數,在angular.toJson的時候,它們並不會被序列化,所以利用$http發回服務端更新的時候,它們並不會影響服務端傳送的資料。同時,在用戶端,我們也能利用對象的這些$$屬性來控制View的狀態,如item.$$isChecked來預設選中某一節點。

我們就可以如下方式來使用這個tree-view:

複製代碼 代碼如下:
<tree-view tree-data="demo.tree" text-field="name" value-field='id' item-clicked="demo.itemClicked($item)" item-checked-changed="demo.itemCheckedChanged($item)" can-checked="true"></tree-view>

效果如下:

希望本文所述對大家AngularJS程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.