- 浏览: 460133 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
a464697691:
楼主厉害,现在可以使用了
Proxool houseKeepingSleepTime bug修正 -
chenpi529:
楼主好牛逼
Proxool houseKeepingSleepTime bug修正 -
huangxinyu_it:
多谢楼主了
Proxool houseKeepingSleepTime bug修正 -
kokorodo:
谢谢了!
zk中文开发手册pdf版(基于3.5.1) -
superscorpio:
public void testImportInContex ...
MVEL2.0控制流
ID空间
将视觉表现(visual presentation)分为几个ZUML页面是很常见的。例如,一个页面用来展示订购单,一个对话框用于进入付款期。如果同一个桌面内所有的组件都是非常明确的,开发人员必须为这个桌面内所有页面维护所有标识的唯一性。为了解决这个问题,ID空间的概念被引入。一个ID空间是一个桌面的组件的子集。唯一性只在ID空间的范围内有保障。
Id空间的最简单形式是一个window(org.zkoss.zul.Window
)。所有window衍生出来的组件(包括window)形成了一个独立的ID空间。因此,你可以将window作为每个页面的最高组件使用,这样,开发人员需要维护每个页面的唯一性。
更一般地说,任何组件可形成一个ID空间,只要它实现了org.zkoss.zk.ui.IdSpace
接口。页面(Page)也实现了这个接口,所以它又是个空间所有者(space owner)。
一个ID空间的最高组件即为空间的所有者,可以使用Component
接口中的getSpaceOwner
方法来获得这个组件。
如果一个称为X的ID空间,从另外一个称为Y的ID空间衍生而来,那么X的所有者是空间Y的一部分,但从X衍生出来的部分并不是空间Y的一部分。
就像在图中描绘的一样,有三个空间:P,A 和C。空间P包括P,A,F和G。空间A包括A,B,C和D。空间C包括C和E。
在相同ID空间内的组件称为fellows,例如A,B,C和D就是同一ID空间内的fellows。
为了获得另一个fellow,可以使用IdSpace
或Component
接口中的getFellow
方法。
请注意可以getFellow
方法可以被同一ID空间内任何组件调用,并不仅限于空间所有者。同样,对于在同一空间内的任何组件,getSpaceOwner
方法返回的是同样的对象,与是否是空间所有者无关。
org.zkoss.zk.ui.Path
类提供了在ID空间内简化定位组件的工具。其使用凡是类似java.io.File
Path.getComponent("/A/C/E"); new Path("A/C", "E").getComponent();
为了能让解释器(interpreter)直接读取到组件,命名空间(org.zkoss.scripting.Namespace
)的概 念被引入。首先,每一个ID空间都有一个确切的命名空间。第二,定义在命名空间内的变量对于属于 同一个命名空间的脚本代码及EL表达式是可见的。
<window border="normal"> <label id="l" value="hi"/> <zscript> l.value = "Hi, namespace"; </zscript> ${l.value} </window>
下面的例子有两个命名空间,一个属于window w1
,另一个属于window w2
。b1
按钮的onClick
事件针对window w2
内定义的label,而b2
按钮的onClick
事件是针对窗口window w1
[24]内的定义的checkbox。
<window id="w1"> <window id="w2"> <label id="c"/> <button id="b1" onClick="c.value = "OK""/> </window> <checkbox id="c"/> <button id="b2" onClick="c.label = "OK""/> </window>
请注意命名空间是有等级的。换言之,window w2
中的zscript
可以看见window w1
中的组件,除非w1凌驾于window w2(sunflower注:让w2看不到w1中的组件)
。因此,在下面的例子中button b1
将会改变标签c
。
<window id="w1"> <window id="w2"> <button id="b1" onClick="c.value = "OK""/> </window> <label id="c"/> </window>
除了ZK指定的添加到命名空间的组件,你可以指定自己的变量通过使用setVariable
方法,这样 zscript
可以直接参考(reference)它们。
除了执行代码,你可以在zscript
元素中直接定义变量和函数,就像下面描绘的一样:
<window id="A> <zscript> Object myvar = new LinkedList(); void myfunc() { ... } </zscript> ... <button label="add" onClick="myvar.add(some)"/> <button label="some" onClick="myfunc()"/> </window>
在zscript
中定义的变量和函数存储在相应脚本语言的解释器(interpreter )中。
就像命名空间[25]一样,定义在zscript
中的变量对于EL表达式都是可见的。
<window> <zscript> String var = "abc"; self.setVariable("var2", "xyz", true); </zscript> ${var} ${var2} </window>
等价于:
<window> abc xyz </window>
请注意,定义在zscript
中的变量比定义在命名空间中的变量有更高的优先级。
<window> <zscript> String var = "abc"; self.setVariable("var", "xyz", true); </zscript> ${var} </window>
等价于:
<window> abc </window>
但如果你之后声明了一个同名组件,这就会令人困惑,就像下面展示的那样。
<window> <zscript> String var = "abc"; </zscript> <label id="var" value="A label"/> ${var.value} <!-- Wrong! var is "abc", not the label --> </window>
因此,建议使用一些命名方式来避免这种困惑。例如,你可以为所有的解释(interpreter)变量加上前缀zs_
。
另外,应该尽量使用局部变量。局部变量是和类名一起被声明的,并且只对某一范围的zscript
代码可见。
<zscript> Date now = new Date(); </zscript>
你可以通过将其放在{}中使局部变量对于EL表达式不可见,如下:
<zscript> { //create a new logic scope String var = "abc"; //visible only inside of the enclosing curly brace } </zscript>
依靠实现,一个解释器或许有确切的范围,或每个ID空间一个逻辑范围来存储这些变量和方法。出于 以上的描述,我们将它们分别称为单范围和多范围的解释器(single-scope and multi-scope interpreters)。
Java解释器(BeanShell)是一个典型的多范围解释器。[26]。它为每个ID空间创建一个独立的解释范围。例如,在下面的例子中分别为window A
和B
创建两个逻辑范围。因此在下面的例子中,var2
仅对于window B
是可见的,var1
对于窗口A
和B
都是可见的。
<window id="A"> <zscript>var1 = "abc";</zscript> <window id="B"> <zscript>var2 = "def";</zscript> </window> </window>
通过Java解释器,你可以为一个最近ID空间(例如一个窗口window)的逻辑范围声明一个局部解释变量(interpreter variable)通过指定类名,如下例所示:
<window id="A"> <window id="B"> <zscript> String b = "local to window B"; </zscript> </window> </window>
下面是一个更复杂的例子,可以产生abc def
。
<window id="A"> <zscript> var1 = var2 = "abc"; </zscript> <window id="B"> <zscript> Object var1 = "123"; var2 = "def"; var3 = "xyz"; </zscript> </window> ${var1} ${var2} ${var3} </window>
Object var1 =
"123
"实际上是为window B
创建了一个局部变量,对象是指定的。另一方面,var2 =
"def
"会使解释器(interpreter)在当前或更高的范围内寻找名称为var2
的变量。var2
变量在window A
内已被定义,变量在此被重定义(overrided)。var3 =
"xyz
"
为窗口(winodw)B
创建了一个局部变量,而window A
并没有定义任何叫做var3
的变量。
Ruby, Groovy 和javaScript解释器(Interpreters)并不支持多范围[27]。这就意味着定义的所有变量,就是说, Ruby存储在一个逻辑范围内(每一个解释器)。因此,定义在一个窗口中的解释变量(interpreter variables)会覆盖定义在另一个窗口中的变量,如果它们在同一个页面内。为了避免这种困惑,你可以为每个变量的名字加上与窗口相关的特殊前缀。
[提示]:每个页面都有它自己的解释器(interpreter)来为zscript代码赋值,如果一个桌面有多个页面,那么它或许有多个解释器的实例(instances of the interpreters)(每一种脚本语言)。
每种脚本语言都与一种解释器(interpreter)相关联。因此,定义在一种语言中的变量和方法对于另外一种语言是不可见的。例如在下面的例子中,变量var
1
和var2
属于两种不同的解释器(interpreter)。
<zscript language="Java"> var1 = 123; </zscript> <zscript language="JavaScript"> var2 = 234; </zscript>
可以通过getVariable
方法获得定义在命名空间内的变量。另一方面,定义在zscript
中的变量是解释它的解释的一部分,它们不是任何命名空间的一部分。换句话说,你不能通过getVariable
方法获取它。
你必须使用getZScriptVariable
方法来获得zscript
中的定义的变量。同样,可以使用getZScriptClass
和getZScriptMethod
方法来获取定义在zscript
中的类和方法。这些方法将会遍历所有的被加载的解释器直到指定的一个被找到。
如果你想找到某个解释器,可以使用getInterpreter
方法先获得解释器,就像下面一样:
<zscript> var1 = 123; //var1 belongs to the interpreter, not any namespace page.getVariable("var1"); //returns null </zscript>
相反,你必须使用getZScriptVariable
方法来获得zscript
中的定义的变量。同样,可以使用getZScriptClass
和getZScriptMethod
方法来获取定义在zscript
中的类和方法。这些方法将会遍历所有的被加载的解释器(interpreter)知道指定的一个被找到。
如果你想找到某个解释器,可以使用getInterpreter
方法先获得解释器,就像下面一样:
page.getInterpreter("JavaScript").getVariable("some"); //interpreter for JavaScript page.getInterpreter(null).getVariable("some"); //interpreter for default language
发表评论
-
zkspring 3.0RC bug 修复
2010-11-19 15:46 1869zkspring 3.0RC bug 修复 ... -
【zk开发】使用Sessions.getCurrent().invalidate()时需要特别注意到问题
2010-11-15 16:25 2440Sessions.getCurrent().invali ... -
【zk开发】use和apply的区别
2010-11-15 14:03 4564use 使用一个组件类,该类必须是当前组件 ... -
【zk开发】java代码给组件添加客户端事件处理javascript
2010-11-10 10:49 1837/** *设置或删除widget的事件监听器,如 ... -
【zk开发】zk中的表单验证(优化版)
2010-11-10 10:41 2402/** * 验证表单 * <p> ... -
【zk开发】ZkUtils 1.2
2010-11-08 10:22 2794ZkUtils 是zk开发中的一些工具方法集合,将散落在 ... -
ZK 5.0.5 chm api文档
2010-11-03 10:11 5876ZK 5.0.5 chm api文档 文档在附件 ... -
ZK 5.0.5正式版发布
2010-11-02 18:24 1188ZK 5.0.5正式版发布 更新日志http: ... -
【zk开发】理解zk事件处理线程
2010-11-01 17:27 2290什么是事件处理线程(EventProcessingTh ... -
【zk开发】zkstudio安装及使用视屏
2010-10-29 16:58 2213安装视屏 http://docs.zkoss ... -
zk5.0.5可能最近两天发布
2010-10-29 13:13 1095zk5.0.5可能最近两天发布 zk5.0 ... -
【zk开发】zk注解的秘密
2010-10-28 14:26 4002The DataBinder that rea ... -
【zk开发】zk内存监控
2010-10-21 09:03 2812所用到的资源 ... -
【zk开发】如何在页面中获得composer对象
2010-10-15 15:31 2640样例: <window id=&qu ... -
【zk开发】jQuery+zk完美客户端
2010-09-14 11:11 2585(function(window) { var lin ... -
【zk开发】zk5.0.4 datebox inplace模式的bug
2010-09-08 16:24 1626zk5.0.4 datebox inplace模式 ... -
使用ZK CE版开发商业软件
2010-09-07 15:50 2481仔细读一下内容 LGPL(GNU Lesser Gene ... -
【zk开发】zk的国际化
2010-09-02 16:22 3824【zk开发】zk的国际化 一,准备资源文件 ... -
zk5.0.4 chm版API
2010-09-01 12:37 1273zk5.0.4 chm版API -
挥起马鞭,升到zk5.0.4
2010-08-31 23:22 1440由于zk5.0.4测试版已发布公开测试,正式版应该很快出 ...
相关推荐
在IT行业中,生成全局唯一的ID(Identifier)是一个常见的需求,特别是在分布式系统中,数据库记录、消息队列等都需要这样的标识符。...在理解和使用时,需要注意时钟同步、ID空间分配以及可能的并发问题。
传统的双重差分(DID)作为政策效应评估方法中的一大利器,受到越来越多人的青睐, 但是,在传统的DID中,一个经典的假设是个体处理效应稳定性假设(Stable Unit Treatment Value ...于是空间双重差分SDID应运而生!
另外,工作节点ID和序列号的分配需要谨慎,以防止ID空间的浪费。 综上所述,Twitter的雪花算法(Snowflake)提供了一种高效、简单的分布式ID生成方案,通过合理的结构设计,确保了全局唯一性和顺序性。在Java环境下...
标准帧能满足多数应用需求,但扩展帧提供更多的ID空间。 5. **CAN驱动库**:在STM32上实现CAN通信通常使用HAL或LL库,这些库提供了配置CAN接口、发送和接收数据的函数。 6. **0.91英寸OLED显示屏**:这是一种小型...
此外,128位的长度对于大多数前端应用来说已经足够,可以提供巨大的ID空间,几乎不可能出现重复。16进制表示则使得每个ID由32个字符组成,易于人类阅读和处理。 使用`random-unique-id`库非常简单,开发者只需引入...
在Simple_DHT中,支持ID空间分区意味着将大的ID空间划分为多个小的分区,每个分区由不同的节点负责。这有利于负载均衡和系统扩展。重新分区则允许动态调整这些分区,以适应网络规模的变化或资源需求的变更。 **基于...
Demo Zero Vectors in TW Decom 1.m 双重差分空间计量模型中空间权重矩阵拆分中W T,NT*D N和W NT,T*D N元素全部为零的演示代码 Demo DID Dummy Varibles GEN 2.m SDID模型中事件虚拟变量、时期虚拟变量及模型估计...
在3.8版本的内核中,进程ID的分配策略是关键组成部分,它涉及到进程ID空间的管理。ID空间是有限的,因此内核必须有效管理已分配的PID,并在必要时进行回收。 2. Linux内核数据结构task_struct:task_struct是Linux...
此外,如果工作机器ID分配不当,可能导致ID空间浪费。 在实际应用中,雪花算法常被用在数据库主键生成、订单号生成、用户唯一标识等领域。`snowflakes`这个文件可能是一个Java实现雪花算法的源代码文件,它包含了...
简单Dht 基于Chord的简单DHT实现。 虽然设计是基于 Chord 的,但它是 Chord 的简化版。 手指表和基于手指的路由没有实现。... 实现的三件事是 1) ID 空间分区/重新分区,2) 基于环的路由,以及 3) 节点加入。
连接和接收 Hello 消息时,双方 peer 都可以获取到共享的子协议信息,并达成一致关于消息 ID 空间的组成。 消息 ID 消息 ID 是从 ID 0x10 开始的紧凑型 ID,保留 0x00-0x10 区间用于 ÐΞVp2p 消息。每个共享的子...
对于大规模网络,尤其是拥有众多小小区的陆地网络,可能需要更大的gNB ID空间。 在实际应用中,可以设定gNB ID的分配策略,比如将较低的ID分配给宏小区,而较高的ID留给小小区。例如,0到50000的gNB ID可以代表宏...
* 事件 ID 8:存储空间不足,无法处理此命令。 * 事件 ID 9:存储控制块地址无效。 * 事件 ID 10:环境不正确。 事件 ID 11-20 * 事件 ID 11:试图加载格式不正确的程序。 * 事件 ID 12:访问码无效。 * 事件 ID ...
2. 类Snowflake方案:这是一种根据时间戳、机器标识和自增序列号划分ID空间的算法。时间戳确保趋势递增,机器标识用于区分不同节点,自增序列号保证在同一毫秒内的ID唯一。这种方案灵活可扩展,QPS高,但同样面临...
DHT的核心是利用哈希函数将存储对象映射到一个大的ID空间,每个节点和数据都有唯一ID。节点ID由NodeID=Hash(Node)计算得出,数据ID由DataID=Hash(Data)计算。系统将ID空间划分为多个子空间,每个节点负责一部分,...
Chord算法的核心思想是将网络中的节点分配到一个逻辑上的圆环(ID空间)中,并按照ID大小进行排序。每个节点负责存储一小段ID空间的数据,并知道其前继节点和后继节点的位置。通过简单的数学运算,Chord可以快速定位...
2. **设置地址**:设备ID位于`0x1FFFF7E8`至`0x1FFFF7EC`的地址空间,其中前两个字节代表制造商ID,后两个字节代表设备ID。 3. **读取ID**:使用HAL库或者直接操作GPIO和内存映射接口来读取这些地址。如果是使用HAL...