TWaver HTML5 继承结构和成员说明

JavaScript是一门动态语言,但是面向对象的特征没有Java那么明显,导致我们开发起来非常不习惯。拿继承来说,Java中有专门的extends和implements关键字实现,但是在JavaScript却引入了一个"别扭的"prototype,而且实现方式有很多种,虽然灵活,却很容易让初学者一头雾水不知所措。TWaver HTML5的doc是一个js文件,对编辑器很友好,但是我们看起来却不是很方便,远不如JavaDoc来得一目了然,于是我们做了另一个html,算是对原js格式doc的补充。先看一下最后完成的效果:

 

运行截图:

 

这并不是一个静态页面,而是用JavaScript动态解析TWaver,所以即使TWaver更新也没关系,只要在这个html中引入新的twaver.js就可以了。

界面说明:整个页面的布局借助twaver.controls.SplitPane实现,左侧是TWaver的树组件,中间是List组件,右侧是一个pre标签,借助beautify和prettify展现js代码。

接下来介绍一下页面上三个部分的实现方式:

 

 

  • Tree的实现,下面是初始化Tree的全部代码:
//twaver.Util.getAllClassNames()返回TWaver所有的内部类型
var allClassNames = twaver.Util.getAllClassNames();
//遍历类名
allClassNames.forEach(function (data) {
     addClass(data);
});
var elementBox = new twaver.ElementBox();
var map = {};
//初始化Tree box
function addClass(name) {
    var node = new twaver.Node(name);
    node.setName(name);
//分割字符串,找我们需要的类或对象
    var clazzArr = name.split(".");
    var clazz = window;
    for (var i = 0; i < clazzArr.length; i++) {
          clazz = clazz[clazzArr[i]];
    } 
//根据不同的类型设置Icon     
    if (typeof clazz === "object") {
          node.setIcon("object");     
    } else if (typeof clazz === "function") {
          node.setIcon("class");     
    }     
    //同时将node存入map,方便查询使用
    map[name] = node;
    node.clazz = clazz;
    elementBox.add(node); } 
    //... 
    var tree = new twaver.controls.Tree(elementBox); 

 
getAllClassNames返回的是类或对象的名字,但是我们要获得实际的类和对象以便可以解析它们的属性和方法。思考一下:在浏览器环境下window是根对象,所有全局对象都是window对象的属性而已,TWaver也不例外,所以我们分割字符串,通过window对象一层一层找属性,最终找到我们要的类或对象。然后我们生成Node,填充box数据容器;同时做了一个&lt; 名字---Node&gt;的映射,后面会用到。 初始化Tree以后设置节点的父子关系:

elementBox.toDatas().forEach(function (data) { 
//TWaver所有内置类型都有superClass属性,指向实际的父类或父对象,通过它可以得到父类然后从map中取出树上相应的节点     
     var superClass = data.clazz.superClass;     
     if (superClass && superClass.getClassName) { 
         data.setParent(map[superClass.getClassName()]);  
     } 
}); 

 

大家注意到,Tree的上方还有一个用来过滤数据的文本框,我们看一下它的事件处理:

 //Tree的过滤文本框 
var treeFilter = document.createElement("input");
treeFilter.type = "text"; 
treeFilter.addEventListener("input", function () {
     var value = treeFilter.value.trim().toLowerCase();     
     if (value.length > 0) {
             tree.setVisibleFunction(function (data) {
                 if(data.getName().toLowerCase().indexOf(value)>=0){return true};
                 //如果当前节点的名字与过滤字符串不匹配,就去查询是否有子节点匹配
                 //如果子节点匹配,父节点同样可见
                 return isChildVisible(data, value);
             });
     } else {
            tree.setVisibleFunction(null);
     }
});
//...
//递归是否有子节点可见
function isChildVisible(parent, value) {
    var children = parent.getChildren();
    for (var i = 0; i < children.size(); i++) {           
          var child = children.get(i);           
           if (child.getName().toLowerCase().indexOf(value) >= 0) {
               return true;
          } else if (isChildVisible(child, value)) {
                return true;
          }
     }
     return false;
}
 
对于Tree过滤器,不能简单的判断当前节点,因为可能当前节点的名字不符合过滤字符串,但是子节点符合,这种时候父节点也要显示,所以需要做递归处理:如果当前节点的子节点符合过滤字符串,当前节点同样可见。
  • List的实现
List比Tree要简单的多,监听Tree的选中改变事件,得到选中的Node然后解析属性和方法,填充进List的数据容器

tree.getSelectionModel().addSelectionChangeListener(function (e) {
     var selectedData = tree.getSelectionModel().getLastData();
     if (selectedData) {
           var html = '';
           list.getDataBox().clear();
           //TWaver内置的属性和方法都在prototype上,所以如果data的类型是function,我们就遍历它的prototype
           var obj = typeof selectedData.clazz === "function" ? selectedData.clazz.prototype : selectedData.clazz;
           for (var name in obj) {
                if (obj.hasOwnProperty(name)) {
                      var listNode = new twaver.Node();
                      if (typeof obj[name] === "function") {
                            listNode.setIcon("method");
                      } else {
                            listNode.setIcon("property");
                      }
                      listNode.setName(name + " - " + typeof obj[name]);
                      //注意getContent方法,对于function直接返回,对于Object再进行一次遍历
                      listNode.content = "" + getContent(obj[name]);
                      html += name + ":" + listNode.content;
                      list.getDataBox().add(listNode);
                 }
            }
            pre.innerHTML = '';
            html = js_beautify(html);
            pre.appendChild(document.createTextNode(html));
            prettyPrint();
       }
});
 
除了填充list,我们还直接把对象属性的js代码组合起来放到右侧pre中,为了规范js代码,我们用到了js_beautify和prettify两个类库,感兴趣的同学可以谷歌一下。
  • pre的实现
在List上点击某个属性或方法的时候,更新pre的内容为属性值或方法代码

//list选中的节点发生变化时更新pre
list.getSelectionModel().addSelectionChangeListener(function (e) {
     var data = list.getSelectionModel().getLastData();
     if (data) {
         pre.innerHTML = '';
         var html = js_beautify(data.content + "");
         pre.appendChild(document.createTextNode(html));
         prettyPrint();
      }
});
 
这三部分介绍完,实际上这个页面也就写完了,通过这些代码,大家应该可以感受到JavaScript的灵活之处,页面布局部分的代码就不介绍了,大家可从下载附件自行研究,最后附上附件 见原文最下方

 

Twaver-html5.zip Twaver学习案例的例子 立即下载

相关推荐

TWaver for HTML5

TWaver的图形组件库中提供了拓扑组件、地图组件、设备图组件,以及表格、树图、属性表、图表等丰富的通用图形界面组件,为电信运营支撑系统(OSS)的开发提供“一站式”的组件产品和解决方案,是快速设计、开发和部署OSS的利器。

Twaver-HTML5基础学习(1)两点一线

我们需要明白 1.图元是最小的单元; 2.图元需要放置到容器中; 3.最终图元会渲染到画布上即可;

见贤思齐焉,见不贤内自省 3323

twaver.js使用示例

twaver示例可直接放到jetty下运行,含twaver.js alarm.html资源。

Twaver-HTML5基础学习(32)Network样式andTree样式

Twaver-HTML5基础学习(32)Network样式andTree样式

见贤思齐焉,见不贤内自省 1068

twaver.js html 版本

TWaver“一站式”UI组件提供包括网络拓扑图、地图、设备面板图、流程图、各种Chart图表、树图、表格等各种通用组件

twaver-html5-5.9.0-api_html5_-5.9.0-api_twaver_

twaver-html5-5.9.0-api

html5设备面板 twaver,TWaver可视化编辑器(二)3D编辑器

接着昨天的继续说哈。作为一款高效、轻量、自带编辑功能小组件,TWaver Java在电信网管界一炮而红,在各大运营商的OSS,BSS,NMS系统中随处可见。采用了TWaver图形组件的上海世博会监控画面: 运营商的传输网管软件: 设备面板管理: 综合资源管理系统: 当然,这仅仅是个开始,桌面应用很快就无法满足Web2.0时代的要求,TWaver Flex,.Net版本应运而生。 在今天看来,HTM...

weixin_35445090的博客 968

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7488

Twaver-HTML5基础学习(40)表格可视化视图组件(Table)

Twaver-HTML5基础学习(40)表格可视化视图组件(Table)

见贤思齐焉,见不贤内自省 1178

S32K314 EB配置MCAL全模块讲解【Autosar——1 MCU模块详解】持续更新中

FIRC(fast internal RC Oscillator) :高速内部时钟,固定48MHZ;SIRC(Slow Internal RC Oscillator):低速内部时钟,固定32KHZ;FXOSC(Fast Crystal Oscillator Digital Controller):高速外部晶振(8-40MHZ),根据原理图选型进行配置;SXOSC():外部低速外部时钟,固定输入32.768KHZ;PLL_PHIn_CLK:时钟倍频锁相环时钟范围(640-1280MHZ);

qq_40488886的博客 1779

silvaco——GaN HEMT探索

上图为输出特性曲线 ,分别是在栅压为1v、3v、5v的情况下,可以看出在1v时器件处于截止状态,只有非常小近似于0的电流通过,随着栅压逐渐增大,沟道开启,产生漏极电流。上图为栅极漏电流曲线和转移特性曲线以及其提取的参数,可以看到阈值电压为=1.30249V,当栅压为0v时,Id=8.01032e-006,当栅压为5V时,Ig=3.11627e-006。albrct.n,低场迁移率模型,bn.albrct,an.albrct是albrct模型中的参数,可以由用户自己设定。lat.temp,晶格自热模型;

weixin_61913839的博客 7616

用TWaver HTML5定制五彩斑斓的链路

最近有客户提到自定义链路的需求,个人感觉非常有代表意义,现在共享出来给大家参考一下。先来看看需求: 链路要分成两半,用两种颜色填充。 填充百分比在不同值域时,用不同颜色。 显示刻度 有个开关,可以控制链路变短,变短后,链路只画开始和结束部分(相当于原始链路的缩影),中间不画 如果有多条链路,链路合并后两端分别显示这些链路中的最高填充百分比 合并前: 合并后: 进入子网后...

web开发自学 483

数字IC设计避坑指南:为什么477条net的DRV问题无法修复?解析don‘t touch hierarchy的影响

本文深入解析了数字IC后端实现中,因“don't touch hierarchy”约束导致大量DRV违规(如477条net)无法自动修复的根本原因。文章以Cadence Innovus工具为例,详细阐述了DRV修复机制与设计保护约束的冲突原理,并提供了从日志定位、风险评估到分级解除约束的完整实战策略,帮助工程师有效解决此类设计收敛难题。

hope8的博客 288

Twaver-HTML5基础学习(2)基本数据元素(Data)

Data对象上的基本属性和如何自定义属性

见贤思齐焉,见不贤内自省 1387

K8S搭建(centos)完整版

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 4145

基于UC3842的反激电源的全面深入解析与MATLAB仿真

内置电流检测,可实现电流模式控制,提高系统的动态响应性。多种保护功能,如欠压锁定、过温保护、短路保护等,确保系统的安全可靠运行。宽工作电压范围,适应不同的电源设计需求。简单的外部元件配置,易于实现。UC3842的典型应用包括开关电源、DC-DC转换器和反激式电源等,其稳定性和可靠性在实际应用中得到了广泛验证。

qq_38334677的博客 1086

Twaver-HTML5基础学习(17)子网(SubNetwork)

Twaver-HTML5基础学习(17)子网(SubNetwork)

见贤思齐焉,见不贤内自省 587

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

twaver API笔记

twaver.Alarm : 告警对象存储, 在告警容器中,告警容器是网元的一部分,用于管理告警对象,每一个告警都可以设置关联网元Id twaver.AlarmBox: 告警容器对象,告警存在网元容器中,作为网元容器的一部分,管理网元容器中所有告警对象 twaver.AlarmElementMapping:告警网元映射对象,定义网元映射关系,一般告警和网元是一对一关系,需要达到一...

weixin_30955617的博客 906

48-OpenCVSharp —-Cv2.MatchTemplate() 函数功能(模板匹配)详解

是 OpenCV 中一个常见且简单的模板匹配算法,适用于目标检测和图像识别中的静态场景。它的优点是易于理解和实现,但在面对旋转、尺度变化、复杂背景或光照变化等挑战时,效果可能大打折扣。在这些情况下,结合多尺度图像、特征匹配算法(如 SIFT、SURF、ORB 等)以及深度学习模型可以显著提高匹配的鲁棒性和精度。模板匹配仍然是一个非常基础但强大的工具,适用于一些简单的图像匹配任务。对于更加复杂和动态的图像识别任务,我们通常会使用其他更加复杂的算法或者深度学习模型来处理。

weixin_45590420的博客 4523

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断

Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断

见贤思齐焉,见不贤内自省 969

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Twaver-HTML5基础学习(4)告警元素(Alarm)

Twaver-HTML5基础学习(4)告警元素(Alarm)

见贤思齐焉,见不贤内自省 1369

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

twaver html5 2d demo,TWaver 2D+GIS+3D的试用和在线Demo

TWaver 3D for HTML5试用下载:各种在线3D Demo:http://idc.servasoft.com:8081/twaver-html5-3d/三维机房、变电站、会议室等都在里面。《zw版&&num;183&semi;Halcon-delphi系列原创教程》 2d照片-3d逆向建模脚本 2d照片-3d逆向建模脚本 3D逆向建模,是逆向工程的核心要素. ...

weixin_35699471的博客 570
上一篇: JTree实现文件树
下一篇: TWaver HTML5 on Microsoft Surface RT
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值