《ExtJS 3详解与实践》阅读补充资料:用BoxComponent制作Logger UI

如果要求的UI控件不需要其他的细节的控件,也就是,仅仅是封装某部分的HTML元素的话,还要听凭布局管理器提供的大小尺寸、布局的调控,那么这个的扩展对象就是Ext.BoxComponent。例如,假设一个Logger类打算是简单地显示log信息,就可以这样定义:

Ext.ns('Ext.ux.Logger');
Ext.ux.Logger = Ext.extend(Ext.BoxComponent, {
tpl: new Ext.Template("<li class='x-log-entry x-log-{0:lowercase}-entry'>",
"<div class='x-log-level'>",
"{0:capitalize}",
"</div>",
"<span class='x-log-time'>",
"{2:date('H:i:s.u')}",
"</span>",
"<span class='x-log-message'>",
"{1}",
"</span>",
"</li>"),
autoEl: {
tag: 'ul',
cls: 'x-logger'
},

autoHide:false,
onRender: function() {
Ext.ux.Logger.superclass.onRender.apply(this, arguments);
this.contextMenu = new Ext.menu.Menu({
items: [new Ext.menu.CheckItem({
id: 'debug',
text: 'Debug',
checkHandler: Ext.ux.Logger.prototype.onMenuCheck,
scope: this
}), new Ext.menu.CheckItem({
id: 'info',
text: 'Info',
checkHandler: Ext.ux.Logger.prototype.onMenuCheck,
scope: this
}), new Ext.menu.CheckItem({
id: 'warning',
text: 'Warning',
checkHandler: Ext.ux.Logger.prototype.onMenuCheck,
scope: this
}), new Ext.menu.CheckItem({
id: 'error',
text: 'Error',
checkHandler: Ext.ux.Logger.prototype.onMenuCheck,
scope: this
})]
});
this.el.on('contextmenu', this.onContextMenu, this, { stopEvent: true });
},
onContextMenu: function(e) {
this.contextMenu.logger = this;
this.contextMenu.showAt(e.getXY());
},
onMenuCheck: function(checkItem, state) {
var logger = checkItem.parentMenu.logger;
var cls = 'x-log-show-' + checkItem.id;
if (state) {
logger.el.addClass(cls);
} else {
logger.el.removeClass(cls);
}
},
debug: function(msg) {
this.tpl.insertFirst(this.el, ['debug', msg, new Date()]);
this.el.scrollTo("top", 0, true);
},
info: function(msg) {
this.tpl.insertFirst(this.el, ['info', msg, new Date()]);
this.el.scrollTo("top", 0, true);
},
warning: function(msg) {
this.tpl.insertFirst(this.el, ['warning', msg, new Date()]);
this.el.scrollTo("top", 0, true);
},
error: function(msg) {
this.tpl.insertFirst(this.el, ['error', msg, new Date()]);
this.el.scrollTo("top", 0, true);
}
});

还有一些样式需要加入:

.x-logger {
overflow: auto;
}
.x-log-entry .x-log-level {
float: left;
width: 4em;
text-align: center;
margin-right: 3px;
}
.x-log-entry .x-log-time {
margin-right: 3px;
}
.x-log-entry .x-log-message {
margin-right: 3px;
}
.x-log-debug-entry, .x-log-info-entry, .x-log-warning-entry, .x-log-error-entry {
display:none;
}
 
.x-log-show-debug .x-log-debug-entry { display: block }
.x-log-show-info .x-log-info-entry { display: block }
.x-log-show-warning .x-log-warning-entry { display: block }
.x-log-show-error .x-log-error-entry { display: block }
 
.x-log-debug-entry .x-log-level { background-color: #46c }
.x-log-info-entry .x-log-level { background-color: green }
.x-log-warning-entry .x-log-level { background-color: yellow }
.x-log-error-entry .x-log-level { background-color: red }

怎么使用?我们将logger放进Window中试试!

logger = new Ext.ux.Logger();
new Ext.Window({
items: logger,
width: 500,
height: 350,
title: "Logger",
layout: "fit"
}).show();
logger.debug("Hello world!");
logger.info("Hello world!");
logger.warning("Hello world!");
logger.error("Hello world!");
logger.debug(88+200);
logger.info({});
logger.warning("Hello world!");
logger.error("Hello world!");

运行截图如:

Logger用法:右键面板探出菜单,以显示内容。

我们把log的信息的HTML列表均放置在一个BoxComponent中。我们在onRender的阶段加入处理,使得右键菜单可以根据CSS样式类的名称操控logged条目的可见性。 位于该层次的对象还提供了特别的模板方法:

  • onResize 此时此刻,BoxComponent的大小已经发生变化,此时可执行剩余的任务。
  • onPosition 此时此刻,BoxComponent的定位已经发生变化,此时可执行剩余的任务。

此处披露的内容是《ExtJS 3详解与实践》
的补充内容,完整的资料敬请参阅《ExtJS 3 详解与实践》
一书的全面介绍。

 

时间: 2024-07-30 03:27:33

《ExtJS 3详解与实践》阅读补充资料:用BoxComponent制作Logger UI的相关文章

《ExtJS 3详解与实践》阅读补充资料:编写Hello World

    使用Ext编写Ajax应用程序时,初学者往往都会感到迷惑:到底应该怎样编写Ajax程序?事实上,每个初学者都会遇到这种情况--不知该如何下手,有时只是因为一点点设置不对就卡住了整个程序的运行,连HelloWorld也可能成为新手的拦路虎.为了帮助新手尽快消除这种困惑,我们这里先为新手准备一份详尽的启动文件清单,说明清楚运行该框架的最基本条件到底是哪些:然后再简单地跑一趟对话框MessageBox作为Hello World.首先是对这份HTML文件的详解:   <!-- 标识html开始

《ExtJS 3详解与实践》阅读补充资料:Ext.extend()中使用super关键字

  既然一门语言被精简了,无论idea还是直观的语法,都务求精简的话,那么这便无形就是一个趋势,趋势往往不为人们的意志转移地转为自己的习惯,思维定性的习惯,连function这个关键字也有某仁兄觉得太长了,有缩减的必要.当然这只是开玩笑而已了.   好像Lisp那样满天 点号.冒号便是灾难.用过Ext继承的人都清楚,每每调用父类成员的时候就是Ext.subClass.superclass.methodName.call/apply(this).一整串的长,好处也是明显的,起码这种完全命名方式一个

《ExtJS 3详解与实践》阅读补充资料:capture()捕获事件

静态方法Ext.util.Observable.capture()是一项有趣的功能,它能够将一项事件进行捕获,跟踪该事件发生的经过.捕获事件就是观察Ext JS事件的调用过程.只要是继承了 Ext.util.Observable的组件,调用capture(),便可得知该组件何时何地怎样响应事件,也算是调试组件时的技巧. // 假设已有一个名为'myWindow'的UI组件,用Ext.getCmp()返回该对象. Ext.util.Observable.capture(Ext.getCmp('my

《ExtJS详解与实践》阅读补充资料:单页面应用程序的设计

在一般的Web GUI 中,每个应用都分散在一个页面中,会随着页面的跳转而反映在浏览器的地址栏上:稍微复杂的基于Web 系统中,都采用划分Frame 元素或打开浏览器新窗口的方式来组织页面,从浏览器的地址看起来,虽然只有一个地址,但是子Frame 的页面还是会整张页面地刷新.AJAX 改变了以往一张页面一次请求的模式,可以允许在同一张页面发起各种的请求,这样我们对于页面的组织形式有了新的途径.在单页面GUI 模型中,主页面是可以独立加载.更新和替换的一些可视元素的组合.通过这种方式,可以不必在每

《ExtJS详解与实践》阅读补充资料:Grid如何高/宽自适应

Grid高度自适应是许多用户开发过程中碰到过的问题.问题在于,尽管本类是由Panel类继承而得到的,但是不支持其基类的某些功能,所以不能都做到好像一般Panel类那样的方法来解决,如autoScroll.autoWidth.layout.items等-- Grid需要指定一个宽度来显示其所有的列,也需要一个高度来滚动列出所有的行.这些尺寸都通过配置项BoxComponent.height和Ext.BoxComponen.width来精确的指定,又或者将Grid放置进入一个带有某种布局风格的容器中

javascript凌厉开发:extjs3详解与实践的光盘代码

问题描述 javascript凌厉开发:extjs3详解与实践的光盘代码 光盘不见了,网上压根就没这资源, 书中的代码都是片断 求助... 解决方案 重买一本或者联系作者发源代码,你的图书上应该有联系方式

《Ext详解与实践》简介

内 容 简 介 富客户端程序RIA 使Web表示层的技术向前迈进了一大步,开创了图形化编程的新一代先河.在它的带动下,许多优秀的RIA开发方案相继问世.这些开发方案各有个秋,但它们都或多或少地从传统桌面程序开发中汲取了营养.随着前端技术的不断进步,以及JavaScript 引擎的速度改善,基于Ajax 方案的Ext JS也在不断进步.Ext JS及与之相关的GXT.Ext SHARP等开发工具的推出,使快速开发.基于可视化快速开发工具又向前迈进一大步. 本书以学习Ext JS的开发人员为基本读者

JavaScript Event Loop机制详解与Vue.js中nextTick的实践应用

本文依次介绍了函数调用栈.MacroTask 与 MicroTask 执行顺序.浅析 Vue.js 中 nextTick 实现等内容;本文中引用的参考资料统一声明在 JavaScript 学习与实践资料索引. 1. 事件循环机制详解与实践应用 JavaScript 是典型的单线程单并发语言,即表示在同一时间片内其只能执行单个任务或者部分代码片.换言之,我们可以认为某个同域浏览器上下中 JavaScript 主线程拥有一个函数调用栈以及一个任务队列(参考 whatwg 规范);主线程会依次执行代码

C语言 文件的打开与关闭详解及示例代码_C 语言

在C语言中,文件操作都是由库函数来完成的,这节介绍文件的打开和关闭. 文件的打开(fopen函数) fopen() 函数用来打开一个文件,它的原型为: FILE *fopen(char *filename, char *mode); filename为文件名(包括文件路径),mode为打开方式,它们都是字符串.fopen() 会获取文件信息,包括文件名.文件状态.当前读写位置等,并将这些信息保存到一个FILE类型的结构体变量中,然后将该变量的地址返回. FILE是在stdio.h头文件中定义的一