这是用过的"最差"树形插件 !!!

或许大家听过一个bootstrap UI框架---ace皮肤。有兴趣的童鞋可以在线查看:https://www.iteblog.com/ace/index.html

相较于此前使用的ExtJs 3.x或者传统的jquery easy ui框架,bootstrap风格的确让人眼前一亮。

但是说到它集成的属性插件,或许就没有那么让人愉快了。

下载官方Demo,找到位于如下位置:

与多数属性控件不同,fuelux.tree 的data格式不是很标准。

格式如下:

是的就是这么任性。

看起来就是反人类的一种格式,开发人员不得不从正常的属性结构做一次转换。

但是当你看了这个效果之后,你也许会和我一样,坚持尝试.是滴,水瓶就是那么坚持!

为了保持项目整体风格的一致性,笔者也只好尝试该控件。

花了大半天时间总算有点眉目,对于其中的艰辛不希望后来者走同样的弯路。方便别人也是帮助自己嘛。哈哈

笔者这里使用的是C#进行动态绑定,故按照结构是如下类,

public class FueluxTree
{
public Dictionary<string, FueluxTreeNode> data { get; set; }
public string status { get; set; }
} /// <summary>
/// 绑定FueluxTreeNode
/// </summary>
public class FueluxTreeNode
{
public string type { get; set; }
public string name { get; set; } public additionalParameters additionalParameters { get; set; }
} public class additionalParameters
{
public int id { get; set; }
public bool itemSelected { get; set; }
public Dictionary<string, FueluxTreeNode> children { get; set; } }
这样基本的json格式就满足了。 接下来需要模拟一些后台数据,按关系型数据库存储格式准备一些数据。 设计类型如下: public class Student
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
public int level { get; set; }
}

服务数据:

public class TestService
{
private static TestService _Instance = null; public static TestService Instance
{
get
{
if (_Instance == null)
_Instance = new TestService();
return _Instance;
}
} private TestService()
{ } public FueluxTree GetTree()
{
FueluxTree _Tree = new FueluxTree();
List<Student> students = GetSutdents();
FueluxTreeNode node = new FueluxTreeNode
{
name = "root",
type = "folder",
additionalParameters = new additionalParameters
{
id = ,
//children=new List<FueluxTreeNode>(),
children = new Dictionary<string, FueluxTreeNode>(),
itemSelected = false,
}
}; _LoopToAppendChildren(students, node); _Tree.data = node.additionalParameters.children;
_Tree.status = "OK"; return _Tree;
} private void _LoopToAppendChildren(List<Student> students, FueluxTreeNode node)
{
//[{status: "OK", data: [{"name":"South Africa","type":"folder","additionalParameters":{"id":"1"}}] }]
var substudents = students.Where(c => c.ParentId == node.additionalParameters.id).ToList(); foreach (Student student in substudents)
{
string type = string.Empty;
if (student.level == )
type = "item";
else
type = "folder"; FueluxTreeNode subnode = new FueluxTreeNode
{
name = student.Name,
type = type,
additionalParameters = new additionalParameters
{
id = student.Id,
//children = new List<FueluxTreeNode>()
children = new Dictionary<string, FueluxTreeNode>()
}
};
//node.additionalParameters.children.Add(subnode);
node.additionalParameters.children.Add(student.Name, subnode);
_LoopToAppendChildren(students, subnode);
}
} public List<Student> GetSutdents()
{
List<Student> _Students = new List<Student>();
_Students.Add(new Student
{
Id = ,
ParentId = ,
Name = "四川",
level=
}); _Students.Add(new Student
{
Id = ,
ParentId = ,
Name = "重庆",
level=
}); _Students.Add(new Student
{
Id = ,
ParentId = ,
Name = "成都",
level=
});
_Students.Add(new Student
{
Id = ,
ParentId = ,
Name = "大邑",
level=
});
_Students.Add(new Student
{
Id = ,
ParentId = ,
Name = "涪陵",
level =
}); return _Students;
}
}

注意:这里 只是Demo,类型为Student,严格讲,应该是Area更为确切.

.net mvc 控制其中返回


[HttpPost]
public JsonResult GetTreeData()
{
var tree= TestService.Instance.GetTree();
return Json(tree,JsonRequestBehavior.AllowGet);
}


后台部分已经完成,相对来说,还是比较精简了.

接下来前台页面如何绑定呢??

@{
ViewBag.Title = "Index";
//Layout = "~/Areas/Admins/Views/Shared/_Layout.cshtml";
Layout = null;
} <h2>Index</h2>
<link href="~/Assets/Ace1.3/css/bootstrap.min.css" rel="stylesheet" />
<link href="~/Assets/Ace1.3/css/font-awesome.min.css" rel="stylesheet" /> <!-- fonts -->
<link href="~/Assets/Ace1.3/css/ace-fonts.css" rel="stylesheet" /> <link href="~/Assets/Ace1.3/css/ace.min.css" rel="stylesheet" />
<!--[if lte IE 9]>
<link rel="stylesheet" href="../assets/css/ace-ie.min.css" />
<![endif]--> <div class="row"> <div class="center" style="width:400px; margin:12px;">
<div class="widget-box align-left transparent">
<div class="widget-header">
<h4 class="lighter smaller">Tree element loading data from server <br /> pre-selecting some items randomly</h4>
</div> <div class="widget-body">
<div class="widget-main padding-8">
<div id="treeview" class="tree"></div>
<div class="hr"></div>
<button id="submit-button" type="button" class="btn btn-sm btn-primary pull-right">
<i class="ace-icon fa fa-check"></i>
Submit
</button>
</div>
</div>
</div>
</div> </div> <div id="modal-tree-items" class="modal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="blue bigger">Treeview selection</h4>
</div> <div class="modal-body">
<div class="row-fluid">
Content can be put inside a hidden input and sent to server
</div> <div class="space-6"></div> <div class="row-fluid">
<textarea spellcheck="false" id="tree-value"></textarea>
</div>
</div> <div class="modal-footer">
<button class="btn btn-sm" data-dismiss="modal"><i class="ace-icon fa fa-times"></i> Cancel</button>
<button class="btn btn-sm btn-primary"><i class="ace-icon fa fa-check"></i> OK</button>
</div> </div>
</div>
</div> <!-- basic scripts -->
<!--[if !IE]> -->
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<!-- <![endif]-->
<!--[if IE]>
<script type="text/javascript">
window.jQuery || document.write("<script src='../assets/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
</script>
<![endif]-->
<script src="~/Assets/Ace1.3/js/fuelux/data/fuelux.tree-sample-demo-data.js"></script>
<script src="~/Assets/Ace1.3/js/bootstrap.min.js"></script>
<script src="~/Assets/Ace1.3/js/fuelux/fuelux.tree.min.js"></script> <!-- ace scripts -->
<script src="~/Assets/Ace1.3/js/ace.min.js"></script>
<script src="~/Assets/Ace1.3/js/ace-elements.min.js"></script> <script type="text/javascript">
$(function () {
var tree_data1 = getTreeData();
console.log(tree_data1);
var treeDataSource = new DataSourceTree({ data: tree_data1 }); $('#treeview').ace_tree({
dataSource: treeDataSource,
loadingHTML: '<div class="tree-loading"><i class="ace-icon fa fa-refresh fa-spin blue"></i></div>',
'open-icon': 'tree-minus',
'close-icon': 'tree-plus',
'selectable': true,
'selected-icon': 'ace-icon fa fa-check',
'unselected-icon': 'ace-icon fa fa-times'
}); $('#tree-selected-items').on('click', function () {
console.log("selected items: ", $('#treeview').tree('selectedItems'));
}); $('#treeview').on('selected', function (evt, data) {
console.log('item selected: ', data);
}); //show selected items inside a modal
$('#submit-button').on('click', function () {
var tree = $('#treeview').data('tree'); var output = '';
var items = tree.selectedItems();
for (var i in items) if (items.hasOwnProperty(i)) {
var item = items[i];
//output += item.additionalParameters['id'] + ":"+ item.name+"\n";
output += item.name + "\n";
} $('#modal-tree-items').modal('show');
$('#tree-value').css({ 'width': '98%', 'height': '200px' }).val(output); }); if (location.protocol == 'file:') alert("For retrieving data from server, you should access this page using a webserver.");
}); function getTreeData() {
var returnvalue; $.ajax({
type: 'POST',
url: "/Admins/AceTree/GetTreeData",
async: false,
dataType: "json",
success: function (result) {
if (result.status == "OK") {
returnvalue = result.data;
}
}
});
return returnvalue;
}
</script>

值得提醒的是,DataSourceTree的定义,来源于example包中,

好了,最终动态绑定已经实现,界面如下

当然,这里主要是将实现功能,美化需要进一步完善。

吐槽:

实际上树形功能和别的插件差不多,只是格式有点奇怪,所以这个也算是使用过的"最差"的一个树形插件,

不过还是因为其友好的UI,选择了坚持使用。

今年的七夕情人节已经来临,在此祝天下有情人终成眷属!

参考资料:

https://www.iteblog.com/ace/treeview.html

http://www.cnblogs.com/zgz21/p/5166871.html

这是用过的"最差"树形插件的更多相关文章

  1. ztree树形插件

    在开发项目中需要用到树插件,近期研究了几款树插件,好记性不如烂笔头 ,写下来  以后好查 MzTreeView(梅花雪) 很经典的树形菜单脚本控件 菜单树展示加载速度快 支持1w条以上大数据 缺点-- ...

  2. 【treeview】 基于jQuery的简单树形插件

    [treeview] 效果图: 前几天想把后台的目录结构通过树形插件的方法反映到前端来,在网上搜了半天只找到了这个treeview,虽然不是很好看,不过还是够用的..用treeview的前提是要有jq ...

  3. 插件使用一树形插件---zTree

    zTree是一款挺好用的树形插件,中文文档齐全,demo丰富. 官方网站是 http://www.treejs.cn/v3/main.php#_zTreeInfo 源码网站 https://githu ...

  4. github 码云 chrome文件树形插件

    偶然间看到github有一个树形插件,对于代码层级较多的项目来说体验提升了很多 github的chrome插件 chrome商店: https://chrome.google.com/webstore ...

  5. 树形插件zTree与组织插件jOrgChart交互

    <html> <head> <title>组织架构</title> <meta http-equiv="content-type&quo ...

  6. Jquery之树形插件

    1.DynaTree (推荐使用,说明文档以及样例在下载的压缩包里\doc\samples.html) DynaTree 是一个优化的动态jQuery树查看插件,它只在需要时才创建DOM元素.支持ch ...

  7. eleTree树形插件引入

    先放一个效果 @eleTree插件官网 刚开始用的xtree,不知为何总是达不到效果,不得已从layui官网插件中寻得这个eleTree插件,看着还不错,用法也简单.不过还是有点坑需要大家注意 开始使 ...

  8. 插件使用一树形插件---zTree一zTree异步加载

    zTree 可以实现异步加载.异步加载可以让初次加载速度快,带来好的用户体验. 异步加载 官方源码中的demo提示了例子.例子是采用php语言. 在java语言中,zTree如何与Servlet结合呢 ...

  9. 树形插件 --- zTree

    地址:http://www.treejs.cn/v3/api.php

随机推荐

  1. WPF基础知识、界面布局及控件Binding(转)

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  2. caffe中权值初始化方法

    首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代 ...

  3. VBA找不到progress bar的处理办法。

    Search your pc for MSCOMCTL.Ocx. If you find it then register it by clicking on Windows Start Button ...

  4. Sass和compass 安装 和配合grunt实时显示 [Sass和compass学习笔记]

    demo 下载http://vdisk.weibo.com/s/DOlfkrAWjkF/1401192855 为什么要学习Sass和compass ?提高站独立和代码产品化的绝密武器,尤其是程序化cs ...

  5. cocos2d-x初步了解

    1.渲染 2.帧率(FPS) 超过75一般就不容易察觉到有明显的流畅度提升 >50 非常好! 30~40  一般, 20~30  及格,有点勉强. 3.渲染驱动游戏 事件驱动游戏 4.cocos ...

  6. UI--普通控件总结1--控件使用

    本文目录 0.UIView常用的属性和操作 0_1.UIView常见的属性 0_2.UIView状态 0_3.UIView常用的方法 1.文本框UITextField和文本视图UITextView 1 ...

  7. google jquery用不了啦,你准备好了吗

    今天,相信很多网站开发人员都有这感觉,明明正常的页面却无法工作了,莫名其妙的错误,笔者也遇到这种错误,细查之下才发现google jquery用不了啦,通过firefox调试发现找不到jquery了, ...

  8. 如何获取google地图、baidu百度地图的坐标

    google:打开google地图-->查找目的地-->右键:此位置居中-->地址栏键入javascript:void(prompt('',gApplication.getMap() ...

  9. 【iCore3应用开发平台】发布 iCore3 应用开发平台寄存器说明

    PDF下载地址:http://pan.baidu.com/s/1qYeZROC

  10. EJB之Timer

    EJB Timer 要么: Annotation @Schedule 或者方法前声明@Timeout 要么: 在部署描述中定义timeout-method 如果是使用@Schedule, Timer在 ...