HTML5技术

Omi树组件omi-tree编写指南 - 【当耐特】

字号+ 作者:H5之家 来源:H5之家 2017-05-02 15:04 我要评论( )

Omi框架能够以少量的代码声明式地编写可拖拽移动节点的树形组件。 通常树组件能够考验UI框架的健壮性,因为需要使用到UI框架的如下特性: 下面来介绍下使用 omi-tree 的开发全过程。你也可以无视文章,先体验一把和直接编辑源码试一把: omi-tree playground

Omi框架能够以少量的代码声明式地编写可拖拽移动节点的树形组件。
通常树组件能够考验UI框架的健壮性,因为需要使用到UI框架的如下特性:

下面来介绍下使用 omi-tree 的开发全过程。你也可以无视文章,先体验一把和直接编辑源码试一把:

omi-tree playground

类划分
  • tree.js 树组件的根容器类,包含节点移动,根据id获取节点等通用方法,这里把其排除在tree-node之外
  • tree-node.js 树节点,自递归嵌套组件,因为tree-node中可以包含tree-node
  • 树的数据规则:

    [ [ [] [] } ] [ [] [] } ] [ [] [] } ] } ] }

    可以看到,每个节点都有唯一的id来标识,每个节点也有children属性来存放自己的子节点的信息。

    组件HTML结构

    tree结构:

    group

  • 通过 o-repeat 生成所有 tree-node
  • group-data 把 data.children 的数据批量传递给各个 tree-node
  • 这里需要特别注意的是:

  • o-repeat 等所有指令对应的 scope 数据是 this.data
  • group-data,data等等 的 scope 是 this
  • tree-node结构:

    ondragstartondropdiv datanamenode

    可以看到每个tree-node都标记了draggable代表可以拖拽,drag和drop的支持情况大家可以caniuse一把。

  • 每个tree-node 既是拖拽对应,也是drop容器对象
  • li、div和ul都标记了 data-node-id 来存放id在dom元素上方便js里读取和传递
  • 完整代码解析

    先看tree:

    (id(.getChildById(parentId, this.data.children) .data.children) parent.children.push(child) this.update() (parentId.getChildById(childId, this.data.children), children (len i < len; i++) { let child = children[i] errorIds .id ) (idlen i < len; i++) { let child = children[i] .splice(i, 1) return child .removeChildById(id, child.children) if (target) { return target (idlen i < len; i++) { let child = children[i] child .getChildById(id, child.children) if (target) { return target () .tag('tree', Tree)

    下面来看 tree-node:

    (evt) .getRootInstance(this.parent).moveNode(parseInt(evt.dataTransfer.getData("node-id")), parseInt(evt.target.dataset['nodeId'])) .node.classList.remove('drag-over') evt.stopPropagation() evt.preventDefault() (parent.moveNode){ return parent .getRootInstance(parent.parent) (evt){ this.node.classList.add('drag-over') evt.stopPropagation() evt.preventDefault() .node.classList.remove('drag-over') ..data.id) evt.stopPropagation() ()().tag('tree-node',TreeNode)

    到此位置,复杂的拖拽移动都完成了。增删改查就更加简单了,大家可以接着试试~~~

    Omi相关

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

      在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

      2017-04-28 15:00

    • JS组件系列——自己动手封装bootstrap-treegrid组件 - 懒得安分

      JS组件系列——自己动手封装bootstrap-treegrid组件 - 懒得安分

      2017-04-28 14:02

    • 表格组件神器:bootstrap table详细使用指南 - 流浪的诗人

      表格组件神器:bootstrap table详细使用指南 - 流浪的诗人

      2017-04-13 09:00

    • GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3 - sheng.chao

      GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3 - shen

      2017-03-22 13:02

    网友点评
    t