在AngularJS中使用jQuery的zTree插件的方法


Posted in Javascript onApril 21, 2016

前段时间一直在看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。

在AngularJS中使用jQuery的zTree插件的方法

Javascript 相关文章推荐
dojo 之基础篇(三)之向服务器发送数据
Mar 24 Javascript
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
瀑布流布局并自动加载实现代码
Mar 12 Javascript
JavaScript简介
Feb 15 Javascript
深入理解JavaScript的React框架的原理
Jul 02 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
Aug 26 Javascript
jQuery实现Tab选项卡切换效果简单演示
Nov 23 Javascript
简单谈谈javascript中this的隐式绑定
Feb 22 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
Apr 20 Javascript
Vue源码学习之关于对Array的数据侦听实现
Apr 23 Javascript
微信小程序实现左滑删除效果
Nov 18 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 #Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 #Javascript
javascript常见数字进制转换实例分析
Apr 21 #Javascript
BootStrap和jQuery相结合实现可编辑表格
Apr 21 #Javascript
动态加载js文件简单示例
Apr 21 #Javascript
JS动态插入并立即执行回调函数的方法
Apr 21 #Javascript
jQuery插件datatables使用教程
Apr 21 #Javascript
You might like
php的ddos攻击解决方法
2015/01/08 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
PHP7新增函数
2021/03/09 PHP
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
js编写简易的计算器
2020/07/29 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
python新手经常遇到的17个错误分析
2014/07/30 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
HTML的form表单和django的form表单
2019/07/25 Python
django实现用户注册实例讲解
2019/10/30 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
50道外企软件测试面试题
2014/08/18 面试题
物业电工岗位职责
2013/11/20 职场文书
环保倡议书怎么写
2014/05/16 职场文书
项目经理任命书内容
2014/06/06 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
学期个人自我总结
2015/02/13 职场文书
大学生读书笔记范文
2015/07/01 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript