起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10760|回复: 12

简单组件开发完整案例

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2012-11-20 15:09:35 | 显示全部楼层 |阅读模式
下面介绍一个比较简单的组件的开发过程。

要开发的组件是高度可调整的文本框(resizeTextarea)。这个组件由一个文本框和两个按钮组成。比文本框组件多实现的功能是用鼠标点击按钮,这个文本框的高度发生相应变化。

组件开发分为两个部分,
一是运行时组件开发,开发的是在浏览器中运行的效果;
二是设计时组件开发,可以实现在w文件中,从组件面板中拖拽组件到设计器中。

本例介绍了组件运行时和设计时的界面设计、介绍了组件的属性、方法,事件的定义及使用方法,

组件相关的文档结构如下:
1.png

远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2012-11-20 15:25:43 | 显示全部楼层

运行时组件开发

  组件运行时效果
1.png


组件有两种实现方式:xsltjava方式

一、Xslt方式

1、  建立组件目录UI/x5demo/components/resizeTextarea
在我们的应用下建立components目录,专门用来存放自己开发的组件,在components目录下建立组件目录,用来存放组件的相关文件。
2、  建立组件描述文件UI/x5demo/components/resizeTextarea.xbl.xml
这个文件是必须有的,它描述了组件的摸样,定义了组件的方法。下面是一个空的组件描述文件。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xbl:xbl xmlns="http://www.w3.org/ns/xbl"
  3.         xmlns:xbl="http://www.w3.org/ns/xbl"
  4.         xmlns:xhtml="http://www.w3.org/1999/xhtml"
  5.         xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="2.0"
  6.         xmlns:xs="http://www.w3.org/2001/XMLSchema"
  7.         xmlns:xforms="http://www.justep.com/xforms"
  8.         xmlns:ev="http://www.w3.org/2001/xml-events"
  9.         script-type="text/javascript">      
  10.         <xbl:binding id="resizeTextarea">
  11.                 <xbl:template template-type="xslt">
  12.                         <xsl:template match="/*" xmlns:xforms="http://www.justep.com/xforms">
  13.                                 <root>
  14.                                 </root>
  15.                         </xsl:template>       
  16.                 </xbl:template>
  17.                 <xbl:implementation>
  18.                 </xbl:implementation>
  19.         </xbl:binding>
  20. </xbl:xbl>       
复制代码
完整代码如下
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xbl:xbl xmlns="http://www.w3.org/ns/xbl"
  3.         xmlns:xbl="http://www.w3.org/ns/xbl"
  4.         xmlns:xhtml="http://www.w3.org/1999/xhtml"
  5.         xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="2.0"
  6.         xmlns:xs="http://www.w3.org/2001/XMLSchema"
  7.         xmlns:xforms="http://www.justep.com/xforms"
  8.         xmlns:ev="http://www.w3.org/2001/xml-events"
  9.         script-type="text/javascript">      
  10.         <!--增加js文件的引用-->
  11.         <xbl:script type="text/javascript"
  12.                 src="/UI/x5demo/components/resizeTextarea/resizeTextarea.js" />
  13.        
  14.         <xbl:binding id="resizeTextarea">
  15.                 <xbl:template template-type="xslt">
  16.                         <xsl:template match="/*" xmlns:xforms="http://www.justep.com/xforms">
  17.                                 <!--定义变量-->
  18.                                 <xsl:variable name="id" select="if(@id) then @id else generate-global-id()" />
  19.                                 <xsl:variable name="textarea-id" select="concat('_textarea_',$id)" />
  20.                                 <root>
  21. <!--加html标签或X5平台组件,放了一个文本框和两个按钮,实现组件在浏览器中的运行效果-->
  22.                                         <xhtml:span xblid="attribute"
  23.                                                                 xbl-obj-id="{$id}"
  24.                                                                 textarea-id="{$textarea-id}"
  25.                                                                 style="display:none"/>
  26.                                         <xforms:textarea id="{$textarea-id}" style="float:left">
  27.                                                 <xsl:if test="@ref!=''">
  28.                                                         <xsl:attribute name="ref" select="@ref"/>
  29.                                                 </xsl:if>
  30.                                         </xforms:textarea>
  31.                                         <xforms:trigger id="tr1" style="float:top">
  32.                                                 <xforms:label>变高</xforms:label>
  33.                                                 <xforms:action ev:event="DOMActivate">
  34.                                                         <xforms:script>
  35.                                         <![CDATA[justep.XBLObject.getXBLObject(event.target).higher();]]>
  36.                                                         </xforms:script>
  37.                                                 </xforms:action>
  38.                                         </xforms:trigger>
  39.                                         <xforms:trigger id="tr2">
  40.                                                 <xforms:label>变矮</xforms:label>
  41.                                                 <xforms:action ev:event="DOMActivate">
  42.                                                         <xforms:script>
  43.                                                 <![CDATA[justep.XBLObject.getXBLObject(event.target).lower();]]>
  44.                                                         </xforms:script>
  45.                                                 </xforms:action>
  46.                                         </xforms:trigger>
  47.                                 </root>
  48.                         </xsl:template>       
  49.                 </xbl:template>
  50.                
  51.                 <xbl:implementation>
  52.                 <!—-定义组件的方法,其中initXBL是默认方法,系统初始化组件时会自动调用-->
  53.                 <![CDATA[
  54.                 ({
  55.                         "initXBL" : function() {
  56.                             this.__attribute_node = this.getElementByXblID('attribute');
  57.                                 justep.Object.extend(this, new justep.resizeTextarea(this));
  58.                         },
  59.                         "__getAttributeValue" : function(name){
  60.                                 return this.__attribute_node?this.__attribute_node.getAttribute(name):'';
  61.                         }
  62.                 })
  63.                 ]]></xbl:implementation>
  64.         </xbl:binding>
  65. </xbl:xbl>       
复制代码

3、  建立组件js文件UI/x5demo/components/resizeTextarea/resizeTextarea.js
resizeTextarea.xbl.xml中引用,实现resizeTextarea.xbl.xml中调用的3个函数。其中包括了调用组件事件。完整代码如下

  1. justep.resizeTextarea = function(xblObject) {
  2.         this._create(xblObject);
  3. };

  4. justep.resizeTextarea.prototype = {
  5.         _create : function(xblObject){
  6.                 if(!xblObject) return;
  7.                 this.textareaId = xblObject.__getAttributeValue('textarea-id');
  8.                
  9.                 this.onAfterChange = xblObject.domNode.getAttribute('onAfterChange');
  10.                 if (this.onAfterChange)
  11.                         this.onAfterChange = justep.Function.get(this.onAfterChange);
  12.                 else
  13.                         this.onAfterChange = null;

  14.         },       

  15.         higher : function() {
  16.                 var m = this.textareaId;
  17.                 var h = parseFloat(justep.xbl(m).input.style.height) + 50;
  18.                 justep.xbl(m).input.style.height = h + "px";
  19.                 var ret = true;
  20.                 if (this.onAfterChange)
  21.                         ret = this.onAfterChange({
  22.                                 'source' : this
  23.                         });

  24.         },
  25.         lower : function() {
  26.                 var m = this.textareaId;
  27.                 var h = parseFloat(justep.xbl(m).input.style.height) - 50;
  28.                 $("#"+m)[0].style.height = h + "px";
  29.                 justep.xbl(m).input.style.height = h + "px";
  30.         }
  31. };
复制代码

4、  说明
resizeTextarea.xbl.xml中组件的属性,可通过@属性名直接访问,例如@ref
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2012-11-20 15:35:19 | 显示全部楼层

运行时组件开发

二、Java方式

我们将上面用xslt方式开发的组件改为java方式。

1、  Java方式说明
Java方式是将w文件中组件的定义部分,作为参数,传入Java方法,在Java方法中,把传入的这段代码改为界面的实现效果返回。
w文件中组件的定义如下
  1. <font size="3"><xhtml:div component="/UI/x5demo/components/resizeTextarea.xbl.xml#resizeTextarea"
  2.       id="resizeTextarea1" ref="data('bizData1')/fString"
  3. onAfterChange="excel.resizeTextarea1AfterChange"/>  
  4. </font>
复制代码
经过java方法处理后,返回如下代码
  1. <font size="3"><root>
  2.         <xhtml:span xmlns:xhtml="http://www.w3.org/1999/xhtml" style="display:none"
  3. xblid="attribute" id="resizeTextarea1" ref="data('bizData1')/fString"
  4. textarea-id="_textarea_resizeTextarea1"
  5.                 onAfterChange="excel.resizeTextarea1AfterChange"/>
  6. <xforms:textarea xmlns:xforms="http://www.justep.com/xforms" style="float:left"
  7. id="_textarea_resizeTextarea1" ref="data('bizData1')/fString"/>
  8.         <xforms:trigger xmlns:xforms="http://www.justep.com/xforms" id="tr1" style="float:top">
  9.                 <xforms:label>变高</xforms:label>
  10.                 <xforms:action xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="DOMActivate">
  11.                         <xforms:script>
  12. <![CDATA[justep.XBLObject.getXBLObject(event.target).higher();]]>
  13. </xforms:script>
  14.                 </xforms:action>
  15.         </xforms:trigger>
  16.         <xforms:trigger xmlns:xforms="http://www.justep.com/xforms" id="tr2" style="float:left">
  17.                 <xforms:label>变矮</xforms:label>
  18.                 <xforms:action xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="DOMActivate">
  19.                         <xforms:script>
  20. <![CDATA[justep.XBLObject.getXBLObject(event.target).lower();]]>
  21. </xforms:script>
  22.                 </xforms:action>
  23.         </xforms:trigger>
  24. </root>
  25. </font>
复制代码
组件的事件和方法,还是使用js实现
2、  修改组件描述文件UI/x5demo/components/resizeTextarea.xbl.xml
将xbl:template节点的内容封上
<xbl:template template-type="xslt"></xbl:template>
改为<template template-type="java" src="ResizeTextarea" />
完整代码如下
  1. <font size="3"><?xml version="1.0" encoding="UTF-8"?>
  2. <xbl:xbl xmlns="http://www.w3.org/ns/xbl"
  3.         xmlns:xbl="http://www.w3.org/ns/xbl"
  4.         xmlns:xhtml="http://www.w3.org/1999/xhtml"
  5.         xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="2.0"
  6.         xmlns:xs="http://www.w3.org/2001/XMLSchema"
  7.         xmlns:xforms="http://www.justep.com/xforms"
  8.         xmlns:ev="http://www.w3.org/2001/xml-events"
  9.         script-type="text/javascript">      
  10.         <xbl:script type="text/javascript"
  11.                 src="/UI/x5demo/components/resizeTextarea/resizeTextarea.js" />
  12.                 <!--增加js文件的引用        -->
  13.         <xbl:binding id="resizeTextarea">
  14.                 <template template-type="java"  src="ResizeTextarea" />
  15.                 <!--<xbl:template template-type="xslt">
  16.                         <xsl:template match="/*" xmlns:xforms="http://www.justep.com/xforms">
  17.                                 <xsl:variable name="id" select="if(@id) then @id else generate-global-id()" />
  18.                                 <xsl:variable name="textarea-id" select="concat('_textarea_',$id)" />
  19.                                 <root>
  20.                                         <xhtml:span xblid="attribute"
  21.                                                                 xbl-obj-id="{$id}"
  22.                                                                 textarea-id="{$textarea-id}"
  23.                                                                 style="display:none"/>
  24.                                         <xforms:textarea id="{$textarea-id}" style="float:left">
  25.                                                 <xsl:if test="@ref!=''">
  26.                                                         <xsl:attribute name="ref" select="@ref"/>
  27.                                                 </xsl:if>
  28.                                         </xforms:textarea>
  29.                                         <xforms:trigger id="tr1" style="float:top">
  30.                                                 <xforms:label>变高</xforms:label>
  31.                                                 <xforms:action ev:event="DOMActivate">
  32.                                                         <xforms:script>
  33.                                                         <![CDATA[justep.XBLObject.getXBLObject(event.target).higher();]]>
  34.                                                         </xforms:script>
  35.                                                 </xforms:action>
  36.                                         </xforms:trigger>
  37.                                         <xforms:trigger id="tr2">
  38.                                                 <xforms:label>变矮</xforms:label>
  39.                                                 <xforms:action ev:event="DOMActivate">
  40.                                                         <xforms:script>
  41.                                                         <![CDATA[justep.XBLObject.getXBLObject(event.target).lower();]]>
  42.                                                         </xforms:script>
  43.                                                 </xforms:action>
  44.                                         </xforms:trigger>
  45.                                 </root>
  46.                         </xsl:template>        
  47.                 </xbl:template>-->
  48.                
  49.                 <xbl:implementation>
  50.                 <![CDATA[
  51.                 ({
  52.                         "initXBL" : function() {
  53.                             this.__attribute_node = this.getElementByXblID('attribute');
  54.                                 justep.Object.extend(this, new justep.resizeTextarea(this));
  55.                         },
  56.                         "__getAttributeValue" : function(name){
  57.                                 return this.__attribute_node?this.__attribute_node.getAttribute(name):'';
  58.                         }
  59.                 })
  60.                 ]]></xbl:implementation>
  61.         </xbl:binding>
  62. </xbl:xbl>        
  63. </font>
复制代码
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2012-11-20 16:12:48 | 显示全部楼层

运行时组件开发


3、  
建立Java文件/UI/x5demo/components/resizeTextarea/dsrc/ResizeTextarea.java
/UI/x5demo/components/resizeTextarea目录下新建dsrc目录,新建ResizeTextarea.java文件。在java文件中,通过实现com.justep.xbl.JavaTemplateexecute方法,获取传入的参数,生成界面组件代码。
完整代码如下
  1. import java.util.Map;
  2. import org.dom4j.DocumentHelper;
  3. import org.dom4j.Element;
  4. import org.dom4j.QName;
  5. import com.justep.ui.system.component.ComponentUtils;
  6. import com.justep.xbl.JavaTemplate;
  7. import com.justep.xbl.runtime.XBLException;

  8. public class ResizeTextarea implements JavaTemplate{
  9.         private String id;
  10.         private String ref;
  11.         private String textareaId;
  12.         private String onAfterChange;
  13.         public Element execute(Element bound, Map context) throws XBLException {
  14. /* 在这里实现从传入的参数bound中获取组件的信息,生成一个span、一个文本框和两个按钮 */
  15.                 this.init(bound);
  16.                 Element root = DocumentHelper.createElement(new QName("root"));
  17.                 root.add(createXBLAttribute());
  18.                 root.add(createTextarea(this.textareaId,this.ref));
  19.                 root.add(createTrigger("tr1","变高","float:top","higher"));
  20.                 root.add(createTrigger("tr2","变矮","float:left","lower"));
  21. /* 可以在这里使用控制台输出看到返回的结果
  22. System.out.println(root.asXML()). */
  23.                 return root;
  24.         }
  25.         
  26.         private void init(Element bound) throws XBLException {
  27.                 this.id = ComponentUtils.getAttributeOfReuired(bound, "id");
  28.                 this.ref = ComponentUtils.getAttributeOfReuired(bound, "ref");
  29.                 this.textareaId = "_textarea_" + this.id;
  30.                 this.onAfterChange = bound.attributeValue("onAfterChange");
  31.         }

  32.         private Element createXBLAttribute() {
  33.                 Element e = Utils.createXBLAttribute();
  34.                 e.addAttribute("id", this.id);
  35.                 e.addAttribute("ref", this.ref);
  36.                 e.addAttribute("textarea-id",this.textareaId);
  37.                 e.addAttribute("onAfterChange", this.onAfterChange);
  38.                 return e;
  39.         }
  40.         
  41.         private Element createTextarea(String id,String ref) {
  42.                 Element e = DocumentHelper.createElement(new QName("textarea", Utils.XFORMS_NAMESPACE));
  43.                 e.addAttribute("id", id);
  44.                 e.addAttribute("style", "float:left");
  45.                 if (!Utils.isStringEmpty(ref))
  46.                         e.addAttribute("ref", ref);
  47.                 return e;
  48.         }

  49.         private Element createTrigger(String id,String label,String style,String funcName) {
  50.                 Element trigger = DocumentHelper.createElement(new QName("trigger", Utils.XFORMS_NAMESPACE));
  51.                 trigger.addAttribute("id", id);
  52.                 trigger.addAttribute("style", style);

  53.                 Element labelElement = trigger.addElement(new QName("label", Utils.XFORMS_NAMESPACE));
  54.                 if (!Utils.isStringEmpty(label))
  55.                         labelElement.setText(label);

  56.                 Element action = Utils.createScriptAction(
  57.                                 "DOMActivate",
  58.                                 null,
  59.                                 "justep.XBLObject.getXBLObject(event.target)."+funcName+"();");
  60.                 trigger.add(action);
  61.                 return trigger;
  62.         }
  63. }
复制代码
4、  建立资源引用文件/UI/x5demo/components/resizeTextarea/model.config.xml
由于在上面的java文件中引用了一些系统提供的Java类,因此需要增加模型资源的引用。在/UI/x5demo/components/resizeTextarea目录下,新建model.config.xml文件。
完整代码如下
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <model xmlns="http://www.justep.com/model">
  3.         <use>/UI/system/components/data</use>
  4.         <use>/UI/system/components/common</use>
  5. </model>
复制代码


远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2012-11-20 16:17:35 | 显示全部楼层

设计时组件开发

组件设计时效果
为了让大家看出,设计时组件和运行时组件的区别,特将设计时组件的效果和运行时组件的效果设计的略有不同。
1.png
1、  准备工作
打开studio\dropins\studio-app\config\config.xml文件,将debug-designer-component节点的值改为true,这样修改组件后,重新打开w文件,修改效果就会生效。
2、  建立组件注册文件UI/x5demo/components/designerComponentReg.xml,并注册该文件
components目录下建立designerComponentReg.xml文件,配置好后,组件会在组件面板中显示出来。也可以复制/UI/system/components/designerComponentReg.xml文件到UI/x5demo/components目录下,修改其内容。完整代码如下。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <reg-info>
  3.         <!-- 组件目录注册  -->
  4.         <component-dirs>
  5.                 resizeTextarea
  6.         </component-dirs>
  7.         <!-- 组件工具箱配置 -->
  8.         <toolbox>
  9.                 <catalog name="formControl" text="自定义" design-view="excel">
  10.                         <item component-name="resizeTextarea"/>
  11.                 </catalog>               
  12.         </toolbox>
  13. </reg-info>
复制代码
UI/x5demo/config目录下,建立studio.xml文件,也可以复制/UI/system/config/studio.xml文件到UI/x5demo/config目录下,修改其内容, 完整代码如下。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <config>
  3.         <component-reg-file>../../components/designerComponentReg.xml</component-reg-file>
  4. </config>
复制代码

3、  建立组件配置文件UI/x5demo/components/resizeTextarea/designer/resizeTextarea.xml

这里定义了组件的描述、在组件面板中显示的图标;定义了组件的属性、事件、及模板代码。完整代码如下
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <elements>
  3.         <!—-配置组件的基本信息 -->
  4.         <element name="resizeTextarea" tag-type="rich" tag-name="div" text="高度可调整的文本框"
  5. icon="textarea.gif" namespace="xhtml" namespace-uri="http://www.w3.org/1999/xhtml"
  6.                 binding-component="/UI/x5demo/components/resizeTextarea.xbl.xml#resizeTextarea"
  7.                 display-property="id" component-class="resizeTextarea" component-type="formControl">

  8.                 <!—-配置组件的属性 -->
  9.                 <properties>
  10.                         <property name="id" text="编号" required="true" />
  11.                         <property name="ref" text="引用" editor-ref="dataRef" required="true"/>       
  12.                 </properties>
  13.                 <!—-配置组件的事件 -->
  14.                 <events>  
  15.                         <event name="onAfterChange"  text="改变之后"/>
  16.                 </events>
  17.                 <!—-模板代码,配置写入w文件的组件代码 -->
  18.                 <templates>
  19.                         <template name="default"><![CDATA[
  20.                                 <xhtml:div xmlns:xhtml="http://www.w3.org/1999/xhtml"
  21. component="/UI/x5demo/components/resizeTextarea.xbl.xml#resizeTextarea"/>
  22.                    ]]></template>
  23.                 </templates>
  24.         </element>
  25. </elements>
复制代码
4、  建立组件设计时js文件UI/x5demo/components/resizeTextarea/designer/resizeTextarea.js

这里定义了组件在设计器中的显示效果,完整代码如下
  1. justep.design.resizeTextarea = function(config){
  2.         this.regAttributes(["disabled","readonly"]);
  3.         justep.design.resizeTextarea.superclass.constructor.call(this,config);
  4. }

  5. justep.extend(justep.design.resizeTextarea, justep.design.Component,{
  6.          paintContent:function(xmlNode){  
  7.             this.createElement("<table id='"+this.id+"' border='1'><tr><td><textarea style='height:100px;width:200px' class='xui-textarea' readonly='true'/></td><td><button>变高</button>
  8. <button>变矮</button></td></tr></table>",xmlNode);
  9.         }
  10. });
复制代码

远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

3

主题

19

帖子

43

积分

新手上路

Rank: 1

积分
43
发表于 2013-1-10 21:59:03 | 显示全部楼层

1

主题

12

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2013-2-19 20:03:49 | 显示全部楼层
收藏

46

主题

155

帖子

643

积分

高级会员

Rank: 4

积分
643
发表于 2013-5-24 16:22:46 | 显示全部楼层
收藏学习

17

主题

93

帖子

322

积分

中级会员

Rank: 3Rank: 3

积分
322
QQ
发表于 2013-6-20 16:17:34 | 显示全部楼层
自定义组件

80

主题

345

帖子

1668

积分

金牌会员

Rank: 6Rank: 6

积分
1668
发表于 2013-7-10 19:04:00 | 显示全部楼层
mark
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-19 15:38 , Processed in 0.068436 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表