最近项目中需要使用到树形菜单。考虑到zTree的效果不错,就决定使用zTree来进行开发,但是在开发中遇到一个问题是:这些菜单的名称等内容是从数据库中获取的。考虑到Angularjs的特性,决定使用zTree + Angularjs进行开发。
首先,肯定是在页面中引入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和后台数据的交互。