前段时间一直在看AngularJS的资料,感觉是个很好的框架,很想有机会尝试用它做点什么。
jQuery ZTree是国内非常不错的JQuery插件,功能齐全,文档和API也非常的友好,之前项目上常用此插件。
AngularJS 功能虽然非常强大,但UI上提供的插件不像JQuery那么多,而且只能通过directive定义扩展的UI插件,虽然国外已经提供了一些基于 directive的Tree功能实现,但毕竟不像ZTree那样强大,而且Tree是做项目中很长用的一个基本功能。
因此,花了一点时间做了一个例子将ZTree应用到AngularJS中。
zTree和后台数据的交互
首先,肯定是在页面中引入Angularjs的相关脚本,例如模块(e.g. app.js)、控制器(e.g. controller.js)、Angularjs的脚本并进行相关标记的使用,然后引入zTree的样式包和zTreed 脚本,可以参看一下代码:
<!DOCTYPE html> <html lang=\"zh-CN\" ng-app=\"app\"> <head> <meta charset=\"utf-8\"> <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> <title>树型菜单</title> <link href=\"plugins/bootstrap-3.3.5/css/bootstrap.min.css\" rel=\"stylesheet\"> <link href=\"css/zTreeStyle.css\" rel=\"stylesheet\"> </head> <% include ./../include/header.html %> <% include ./../include/top-menu.html %> <div id=\"content\" class=\"content clearfix\" ng-controller=\"wtConfigInfo\"> <ul tree id=\"tree\" style=\"font:normal 12px/35px \'Arial\';color:#dcdcdc;\" class=\"ztree\" ng-model=\"selectNode\" value=\"1\" > </div> <% include ./../include/footer.html %> <script src=\"plugins/jquery-1.11.3.min.js\" type=\"text/javascript\"></script> <script src=\"plugins/bootstrap-3.3.5/js/bootstrap.min.js\" type=\"text/javascript\"></script> <script src=\"..//js/angular.min.js\" type=\"text/javascript\"></script> <script src=\"..//js/angular/app.js\" type=\"text/javascript\"></script> <script src=\"..//js/angular/controllers.js\" type=\"text/javascript\"></script> <script src=\"../plugins/zTree/jquery.ztree.all-3.5.js\" type=\"text/javascript\"></script> </body> </html>
在上面的在ul标签中添加了指令tree,这样在加载angularjs中,就可通过指令 tree来进行菜单数据的获取。具体的代码可参考以下代码:
var app = angular.module(\'app\', []); //树形结构 app.directive(\'tree\',function(){ return{ require:\'?ngModel\', restrict:\'A\', link:function($scope,element,attrs,ngModel){ var setting = { data :{ simpleData:{ enable:true } }, callback:{ beforeClick:function(treeId, treeNode) {//点击菜单时进行的处理 var zTree = $.fn.zTree.getZTreeObj(\"tree\"); if (treeNode.isParent) { zTree.expandNode(treeNode); return false; } else { window.location.href=treeNode.url; return true; } } } }; //向控制器发送消息,进行菜单数据的获取 $scope.$emit(\"menu\",attrs[\"value\"]);//此处attrs[\"value\"]为ul中的value值,此处作为标记使用 //接受控制器返回的菜单的消息 $scope.$on(\"menuData\",function(event,data){ $.fn.zTree.init(element, setting, data);//进行初始化树形菜单 var zTree = $.fn.zTree.getZTreeObj(\"tree\"); var selectName = $(\"#selectName\").val(); if(typeof selectName == \"undefined\" || selectName == \"\"){ zTree.selectNode(zTree.getNodeByParam(\"id\",\"1\"));//默认第一个选中 $(\"#selectName\").val(zTree.getSelectedNodes()[0].code);//赋值 }else{ for(var i =0; i<data.length;i++){ if(data[i][\"code\"] == selectName ){ zTree.selectNode(zTree.getNodeByParam(\"code\", data[i][\"code\"])); } } } }); } } });
在上述代码中,使用$scope.$emit(\"menu\",attrs[\"value\"]);向父控制器发送请求数据,在控制器代码中可以接受此消息,并使用$http向后台进行数据的请求,并将从数据库中请求来的数据发送个子控制器。控制器的代码可参考如下:
function wtConfigInfo($scope,$http){ //接受子控制器发送的消息 $scope.$on(\"menu\",function(event,params){ $http.get(\"/commonfuncode\").success(function(data){ //发送消息给子控制器 $scope.$broadcast(\"menuData\",dealMenuData(data,params)); }); }); }
这样,就完成了zTree和后台数据的交互。
利用指令集成ZTree的实例
<!doctype html> <html lang=\"en\" ng-app=\"app\"> <head> <meta charset=\"utf-8\"> <title>ZTree</title> <link rel=\"stylesheet\" href=\"css/app.css\"> <link rel=\"stylesheet\" href=\"css/bootstrap.css\"> <link rel=\"stylesheet\" href=\"css/animations.css\"> <link rel=\"stylesheet\" href=\"css/zTreeStyle/zTreeStyle.css\"> <script src=\"lib/jquery-1.10.2.min.js\"></script> <script src=\"lib/jquery.ztree.all-3.5.js\"></script> <script src=\"lib/angular.min.js\"></script> <script src=\"app.js\"></script> </head> <body> <body ng-controller=\'MyController\'> <ul tree class=\"ztree\" ng-model=\"selectNode\"></ul> </body> <pre> {{selectNode | json}} </pre> </body> </html>
app.js
\'use strict\'; /* App Module */ var appModule = angular.module(\'app\', []); appModule.directive(\'tree\', function () { return { require: \'?ngModel\', restrict: \'A\', link: function ($scope, element, attrs, ngModel) { //var opts = angular.extend({}, $scope.$eval(attrs.nlUploadify)); var setting = { data: { key: { title: \"t\" }, simpleData: { enable: true } }, callback: { onClick: function (event, treeId, treeNode, clickFlag) { $scope.$apply(function () { ngModel.$setViewValue(treeNode); }); } } }; var zNodes = [ { id: 1, pId: 0, name: \"普通的父节点\", t: \"我很普通,随便点我吧\", open: true }, { id: 11, pId: 1, name: \"叶子节点 - 1\", t: \"我很普通,随便点我吧\" }, { id: 12, pId: 1, name: \"叶子节点 - 2\", t: \"我很普通,随便点我吧\" }, { id: 13, pId: 1, name: \"叶子节点 - 3\", t: \"我很普通,随便点我吧\" }, { id: 2, pId: 0, name: \"NB的父节点\", t: \"点我可以,但是不能点我的子节点,有本事点一个你试试看?\", open: true }, { id: 21, pId: 2, name: \"叶子节点2 - 1\", t: \"你哪个单位的?敢随便点我?小心点儿..\", click: false }, { id: 22, pId: 2, name: \"叶子节点2 - 2\", t: \"我有老爸罩着呢,点击我的小心点儿..\", click: false }, { id: 23, pId: 2, name: \"叶子节点2 - 3\", t: \"好歹我也是个领导,别普通群众就来点击我..\", click: false }, { id: 3, pId: 0, name: \"郁闷的父节点\", t: \"别点我,我好害怕...我的子节点随便点吧...\", open: true, click: false }, { id: 31, pId: 3, name: \"叶子节点3 - 1\", t: \"唉,随便点我吧\" }, { id: 32, pId: 3, name: \"叶子节点3 - 2\", t: \"唉,随便点我吧\" }, { id: 33, pId: 3, name: \"叶子节点3 - 3\", t: \"唉,随便点我吧\" } ]; $.fn.zTree.init(element, setting, zNodes); } }; }); appModule.controller(\'MyController\', function ($scope) { });
实现功能:定义tree这个属性,使<ul tree class=\"ztree\" ng-model=\"selectNode\"></ul>自动变成一个有数据的tree,点击树节点,自动变更model 的selectNode。
本文地址:https://www.stayed.cn/item/17750
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我