webix源码阅读
最近在用webix,需要一个类似九宫格的监控界面。自带的控件里没有,于是萌生出做一个Custom Component的需求。不过webix关于自定义控件的文档比较少,官方只有一篇《Creating a Custom Component》讲基本的构建过程,但内容比较浅,和《DIY - Custom Integration Patter》讲的是怎么与第三方组件集成。
对着文档看了几遍,还是觉得没有思路,少不得要去看源码了。里面大把的控件,不都是最好的例子吗。这篇大致讲一下对源码粗浅的理解,下篇展示一个初步成型的九宫格控件。
1. webix对象的构建过程
我们知道,一句简单的webix.ui({ view: "button" });
就能构造1个按钮,背后发生了什么?
以button为例,webix对象的构建分为3步:
- 延迟编译button类:
webix.protoUI({ name:"button",... });
只是一个注册,只有在真正构造之前,才会编译+生成这个类。 - 用config生成button对象:包括调用所有基类的构造函数$init、解析设置_parseSettings、以及调用$ready里的函数链。这个过程会生成button对象和dom树(html+css)。
- 把对象绘制到dom树中:包括_appendDom、计算Size、以及render。
涉及到的关键步骤如下:
ui = webix.ui = function(config, parent, id){
top_node = ui._view(config);
_appendDom(node, top_node, config);
};
//注册button类,返回button类的编译函数t
webix.protoUI = function(){
var t = function(data){
webix.ui[selfname] = webix.proto.apply(webix, params);
};
};
//真正编译生成原型(button类)的地方,包括:
//1. 多继承(将所有基类属性+func拼到1个button类里)
//2. 将所有基类构造函数$init拼成1个自己的大的构造函数等
webix.proto = function(){
for(var key in origins[i]){
compilation[key] = origin[i][key];
}
compilation.$init = function(){
for(var i=0;i<construct.length;i++)
construct[i].apply(this, arguments);
};
var result = function(config){};
result.prototype = compilation;
return result;
};
var _appendDom = function(node, top_node, config){
node.appendChild(top_node._viewobj);
top_node.adjust(); // $setSize()->render()
};
以下几点值得注意:
- 编译的过程实际上是把其他几个类的属性都合并到1个新的类里,并设置所有Default值,生成prototype,这就是所谓的多继承。
- 然后把所有类的$init()串在一起,形成新类的$init()。
- 新类的构造函数里,将依次调用$init、_parseSettings、$ready里的所有方法。
- 编译的过程只走一次,下次构造button时不会再走。多数类型都是延迟编译,只有必定会用到的基类会在注册后就立马编译,比如:layout、view。这是2个最重要的基类,所以即时编译。
2. 继承体系
有2条主线:
- baseView<-view<-(button、window等)朝着各种单独的控件延伸下去
- baseView<-baseLayout<-layout<-(toolbar、tabView等)朝着各种布局类延伸下去
2个最重要的基类就是view和layout,其中控件类以render()和on_click等事件处理为核心,布局类以_parse_cells和操作_collection为核心
3. 事件系统EventSystem
待填坑
4. js的小技巧
里面有不少js的小技巧值得学习:
- 对"||"的大量运用,用于
undefined || null || 0 || default值
的场景,因为js是动态语言,每个逻辑严密的func里都要用类似的方式保证参数有值。 - 注意函数调用过程中this指向的变化、以及Scope上下文的变化(包括Local、Closure和Global)。
- 闭包一般用于返回待执行的callback,而Type.prototype.func.apply(target, arguments)则可以将target传给任意类的func进行调用。
- 定义匿名函数并立即执行:
+function($){...}(jQuery);
,常规的写法是:(function($){...})(jQuery);
这是我第一个学习的js库,仍有大量值得学习的东西待发掘,新的发现会不断补充进来。
webix源码阅读的更多相关文章
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
随机推荐
- paper 97:异质人脸识别进展的资讯
高新波教授团队异质人脸图像识别研究取得新突破,有望大大降低刑侦过程人力耗费并提高办案效率 近日,西安电子科技大学高新波教授带领的研究团队,在异质人脸图像识别研究领域取得重要进展,其对香 ...
- linux中非root用户使用wireshark进行抓包
开始的时候我是在终端中使用sudo 命令打开 wireshark 的,因为如果不这样的话 wireshark 就没法抓包啊.偶尔抓一次包就使用这样的方式提权. 今天使用 wireshark 的时候特意 ...
- MVC中return File(byte[],"image/jpeg")输入图片不清晰
MVC中需要输入图片的时候有一个便捷的方法,return File(byte[],"image/jpeg"); 但是这样处理的图片很不清晰(特别是要进行缩放,DrawImage,D ...
- 原生JS--Ajax
原生Ajax: Ajax基础:--ajax:无刷新数据读取,读取服务器上的信息--HTTP请求方法: --GET:用于获取数据,如浏览帖子 --POST:用于上传数据,如用户注册 --GE ...
- CentOS下LAMP一键yum安装脚本
本脚本适用环境: 系统支持:CentOS/Redhat/Fedora 内存要求:≥64M 硬盘要求:2GB以上的剩余空间 服务器必须配置好软件源和可连接外网 必须具有系统 root 权限 建议使用干净 ...
- [问题2015S05] 复旦高等代数 II(14级)每周一题(第六教学周)
[问题2015S05] 设 \(A\) 是 \(n\) 阶复方阵, 证明: \(A\) 可对角化的充分必要条件是 \(A\) 相似于某个如下的循环矩阵: \[C=\begin{pmatrix} a_ ...
- 从零开始学iPhone开发(4)——使用WebView
转自 总结关于iPhone中UIWEBVIEW读取本地GBK编码格式html 关于webView读取本地GBK编码的html,尝试了两天,终于成功. 欢喜之余,把感想记下来.一般来说,不成都是人犯错, ...
- php 中的常量
1.__FINE__ 返回当前常量所在的行号. 2.__FILE__ 返回文件的完整路径和文件名. 3.__FUNCTION__ 返回函数名称. 4.__CLASS__ 返回类名称. 5.__METH ...
- [HIHO1052]基因工程(找规律)
题目链接:http://hihocoder.com/problemset/problem/1052 题意:中文题面,就是修改其中几个字符,使得[0,k-1]和[n-k,n-1]的字符相同. 会发现一个 ...
- UITableView优化的方法
使用不透明视图. 不透明的视图可以极大地提高渲染的速度.因此如非必要,可以将table cell及其子视图的opaque属性设为YES(默认值). 其中的特例包括背景色,它的alpha值应该为1(例如 ...