技术开发 频道

云想衣裳花想容 -- JSI组件模型介绍

    JSI组件模型是一种用来装饰简单html元素的框架,使用简单的xml标记,标识其装饰行为,比如将一个普通的input装饰成一个日期输入控件,将一 个html ul标记装饰成菜单或树,将一个textarea装饰成一个代码语法高亮显示区域,或一个wysiwyg html编辑器。
    JSI启动后将自动检查decorator标记,构建层次结构,自动做相关类的寻找、导入和装饰操作;实现零脚本代码的web富客户端编程。

代码示例:
日期选择器 (DatePicker):
<d:datepicker>  
  <input type="text" name="test2" />  
</d:datepicker>  


编辑器示例 (Editor):
<d:editor>  
  <textarea name='editorText'>This is some <strong>sample text</strong>. You are using <a  
    href="
http://www.fckeditor.net/">FCKeditor</a>.</textarea>  
</d:editor>  
Spinner控件(Spinner 类似window时间日期管理中,年份调节的控件):

<d:spinner start='0' end='8' step='2'>  
  <input type="text" name="test2" value='0' />  
</d:spinner>  

客户端包含(Include):

<d:include url='menu.xml' xslt="menu.xsl"></d:include>  


代码语法高亮显示控件(Code):
<d:code language="js">  
 <textarea>alert(‘Hello World’)</textarea>  
</d:code>  

标签页控件(TabBox参照xul tabbox标签):
<d:tabbox>  
 
<d:tabs>
  
   
<d:tab>tab1</d:tab>
  
   
<d:tab>tab2</d:tab>
  
   
<d:tab>tab3</d:tab>
  
 
</d:tabs>
  
 
<d:tabpanels>
  
   
<d:tabpanel>content1</d:tabpanel>
  
   
<d:tabpanel>content2</d:tabpanel>
  
   
<d:tabpanel>content3</d:tabpanel>
  
 
</d:tabpanels>
  
</d:tabbox>

综合示例:
来一个复杂一点的完整的例子,以日期选择控件的演示页面为例
页面上有: 标签页装饰器(TabBox….)、源代码高亮显示装饰器(Code)、日期选择装饰器(DatePicker)、包含装饰器(Include):

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:d="http://www.xidea.org/taglib/decorator" xml:lang="zh_CN" lang="zh_CN"> <head> <script src="../scripts/boot.js"></script> <title>DatePicker 示例</title> </head> <body> <h2>DatePicker 示例</h2> <!-- 开始标签页装饰器 --> <d:tabbox> <d:tabs> <d:tab>效果</d:tab> <d:tab>代码</d:tab> </d:tabs> <d:tabpanels> <d:tabpanel> <!-- 开始日期装饰器(内嵌式) --> <d:datepicker type='grid'> <input type="text" name="test1" /> </d:datepicker> <!-- 开始日期装饰器(弹出式) --> <d:datepicker> <input type="text" name="test2" /> </d:datepicker> </d:tabpanel> <d:tabpanel> <!-- 开始代码高亮显示 --> <d:code language="xml"> <textarea> &lt;!-- 开始日期装饰器(内嵌式) --&gt; &lt;d:datepicker type='grid'&gt; &lt;input type="text" name="test1" /&gt; &lt;/d:datepicker&gt; &lt;!-- 开始日期装饰器(弹出式) --&gt; &lt;d:datepicker&gt; &lt;input type="text" name="test2" /&gt; &lt;/d:datepicker&gt;</textarea> </d:code> </d:tabpanel> </d:tabpanels> </d:tabbox> <select style="margin-left:120px"><option>弹出的datepicker 可覆盖IE select</option></select> <hr /> <!-- 开始Include装饰器,包含装饰器菜单 --> <d:include url='menu.xml' xslt="menu.xsl"></d:include> </body> </html>

装饰引擎简介:
系统默认的装饰引擎为:js.html.DecoratorEngine。
JSI装载后,将做如下操作:

判断有无装饰器命名空间声明(xmlns:d= "http://www.xidea.org/taglib/decorator")
若有,将在文档装载结束后,启动装饰引擎,初始化当前可用的装饰提供者表。(装饰提供者是一个JavaScript包,在注册这种装饰包时可同时指定他的别名,别名*表示默认包)
遍历当前文档,凡是该命名空间的节点,都被看作需要装饰的元素。若当前文档存在装饰元素,启用遮罩(关机效果),页面将不可操作(仍可查阅)。
查找装饰元素对应的装饰类(通过tagName判断类名),采用异步方式动态装载这些装饰器类(不会装载到全局空间),并更新当前进度信息,同时设置装饰器之间的关系(parent,children)。
以深度遍历的方式遍历这些节点,注册组件(以后可以通过$JSI.getDecorator函数获取装饰器对象),依次执行他们的before操作,和decorate操作。
完成装饰,取消遮罩,页面进入可用状态。
装饰器规范简介:
装饰器指的是所有继承自 js.html.Decorator的类。一般来说,可将一组装饰器归为同一个包中(太复杂的装饰器,应将具体逻辑放置在其他包中),能后在配置文件中定义装饰包。
scripts/config.js   $JSI.addDecoratorProvider("org.xidea.decorator","xidea","*");

装饰器类包含两个方法before、docorate分别在遍历前(子节点未装饰)和遍历后(子节点装饰完成)调用。

同时,装饰引擎遍历时还将注入如下三个属性:

parent:父装饰器
children:子装饰器集合
attributes:装饰器属性集对象(只有一个成员函数:get(attrName)  )
JSI现有装饰器集合简介
目前JSI2最高版本2.0预览版 (2007-04-16)包含如下装饰器:

DatePicker
日期选择控件,参照xul datepicker标签,支持弹出方式(默认值 type='pop'),和内嵌式(type='grid')
Editor
编辑器控件,参照xul editor标签
Spinner
Spinner控件(window时间日期管理中,年份调节的控件),参照backbase 的 Spinner标签
TabBox、Tabs、Tab、TabPanels、TabPanel
TabBox(标签页)控件,参照xul tabbox标签
 Code
代码语法高亮显示控件,参照SyntaxHighlighter的显示风格
Include
片断包含标签,支持xpath选取文档片断,支持xslt转换


这些装饰器的演示见(SF的web空间。网速很慢时请将工程下载到本地运行):
http://jsi.xidea.org/decorator/index.html

 目前JSI自带的装饰器不够丰富,而且都还是初级阶段,不够完善。现在发布的这些装饰器,主要是为了演示JSI的工作方式,编码风格,希望能吸引第三方团队、公司在这个基础上开发出自己的更加实用的装饰器集合。

JSI及其装饰引擎采用LGPL协议。可以商业应用,当能,更希望能开源。

 

 

0
相关文章