`

ID空间

    博客分类:
  • ZK
阅读更多

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,可以使用IdSpaceComponent接口中的getFellow方法。

请注意可以getFellow方法可以被同一ID空间内任何组件调用,并不仅限于空间所有者。同样,对于在同一空间内的任何组件,getSpaceOwner方法返回的是同样的对象,与是否是空间所有者无关。

org.zkoss.zk.ui.Path类提供了在ID空间内简化定位组件的工具。其使用凡是类似java.io.File

Path.getComponent("/A/C/E");
new Path("A/C", "E").getComponent();

命名空间和ID空间

为了能让解释器(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 w2b1按钮的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 = &quot;OK&quot;"/>
   </window>
   <checkbox id="c"/>
   <button id="b2" onClick="c.label = &quot;OK&quot;"/>
</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 = &quot;OK&quot;"/>
   </window>
   <label id="c"/>
</window>

除了ZK指定的添加到命名空间的组件,你可以指定自己的变量通过使用setVariable方法,这样 zscript可以直接参考(reference)它们。

zscript中定义变量和函数

除了执行代码,你可以在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 )中。

zscriptEL表达式

就像命名空间[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>

多范围(Multi-Scope)的解释器

依靠实现,一个解释器或许有确切的范围,或每个ID空间一个逻辑范围来存储这些变量和方法。出于 以上的描述,我们将它们分别称为单范围和多范围的解释器(single-scope and multi-scope interpreters)。

Java解释器(BeanShell)是一个典型的多范围解释器。[26]。它为每个ID空间创建一个独立的解释范围。例如,在下面的例子中分别为window AB创建两个逻辑范围。因此在下面的例子中,var2仅对于window B是可见的,var1对于窗口AB都是可见的。

<window id="A">
   <zscript>var1 = "abc";</zscript>
   <window id="B">
      <zscript>var2 = "def";</zscript>
   </window>
</window>
Java解释器(BeanShell)

通过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的变量。

单范围(Single-Scope)解释器

Ruby, Groovy 和javaScript解释器(Interpreters)并不支持多范围[27]。这就意味着定义的所有变量,就是说, Ruby存储在一个逻辑范围内(每一个解释器)。因此,定义在一个窗口中的解释变量(interpreter variables)会覆盖定义在另一个窗口中的变量,如果它们在同一个页面内。为了避免这种困惑,你可以为每个变量的名字加上与窗口相关的特殊前缀。

[提示]:每个页面都有它自己的解释器(interpreter)来为zscript代码赋值,如果一个桌面有多个页面,那么它或许有多个解释器的实例(instances of the interpreters)(每一种脚本语言)。

在一个页面中使用多种脚本语言

每种脚本语言都与一种解释器(interpreter)相关联。因此,定义在一种语言中的变量和方法对于另外一种语言是不可见的。例如在下面的例子中,变量var 1var2属于两种不同的解释器(interpreter)。

<zscript language="Java">
   var1 = 123;
</zscript>
<zscript language="JavaScript">
   var2 = 234;
</zscript>

getVariableVS getZScriptVariable

可以通过getVariable方法获得定义在命名空间内的变量。另一方面,定义在zscript中的变量是解释它的解释的一部分,它们不是任何命名空间的一部分。换句话说,你不能通过getVariable方法获取它。

你必须使用getZScriptVariable方法来获得zscript中的定义的变量。同样,可以使用getZScriptClassgetZScriptMethod方法来获取定义在zscript中的类和方法。这些方法将会遍历所有的被加载的解释器直到指定的一个被找到。

如果你想找到某个解释器,可以使用getInterpreter方法先获得解释器,就像下面一样:

<zscript>
   var1 = 123; //var1 belongs to the interpreter, not any namespace
   page.getVariable("var1"); //returns null
</zscript>

相反,你必须使用getZScriptVariable方法来获得zscript中的定义的变量。同样,可以使用getZScriptClassgetZScriptMethod方法来获取定义在zscript中的类和方法。这些方法将会遍历所有的被加载的解释器(interpreter)知道指定的一个被找到。

如果你想找到某个解释器,可以使用getInterpreter方法先获得解释器,就像下面一样:

page.getInterpreter("JavaScript").getVariable("some"); //interpreter for JavaScript
page.getInterpreter(null).getVariable("some"); //interpreter for default language

 

分享到:
评论

相关推荐

    生成数字的全局唯一Id.zip

    在IT行业中,生成全局唯一的ID(Identifier)是一个常见的需求,特别是在分布式系统中,数据库记录、消息队列等都需要这样的标识符。...在理解和使用时,需要注意时钟同步、ID空间分配以及可能的并发问题。

    空间双重差分代码(SDID),空间双重差分是传统双重差分的升级,考虑了空间相关性

    传统的双重差分(DID)作为政策效应评估方法中的一大利器,受到越来越多人的青睐, 但是,在传统的DID中,一个经典的假设是个体处理效应稳定性假设(Stable Unit Treatment Value ...于是空间双重差分SDID应运而生!

    Twitter的分布式自增ID雪花算法snowflake

    另外,工作节点ID和序列号的分配需要谨慎,以防止ID空间的浪费。 综上所述,Twitter的雪花算法(Snowflake)提供了一种高效、简单的分布式ID生成方案,通过合理的结构设计,确保了全局唯一性和顺序性。在Java环境下...

    R.rar_STM32F103 CAN 多机通信_can ID_多节点 CAN通信

    标准帧能满足多数应用需求,但扩展帧提供更多的ID空间。 5. **CAN驱动库**:在STM32上实现CAN通信通常使用HAL或LL库,这些库提供了配置CAN接口、发送和接收数据的函数。 6. **0.91英寸OLED显示屏**:这是一种小型...

    前端开源库-random-unique-id

    此外,128位的长度对于大多数前端应用来说已经足够,可以提供巨大的ID空间,几乎不可能出现重复。16进制表示则使得每个ID由32个字符组成,易于人类阅读和处理。 使用`random-unique-id`库非常简单,开发者只需引入...

    Simple_DHT:基于Chord协议实现了简单的DHT,以支持ID空间分区,重新分区,基于环的路由和节点联接。 使用SQLite在本地存储应用程序数据

    在Simple_DHT中,支持ID空间分区意味着将大的ID空间划分为多个小的分区,每个分区由不同的节点负责。这有利于负载均衡和系统扩展。重新分区则允许动态调整这些分区,以适应网络规模的变化或资源需求的变更。 **基于...

    空间双重差分(SDID)matlab代码 亲测可用哦

    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模型中事件虚拟变量、时期虚拟变量及模型估计...

    Linux内核进程管理之进程ID.pdf

    在3.8版本的内核中,进程ID的分配策略是关键组成部分,它涉及到进程ID空间的管理。ID空间是有限的,因此内核必须有效管理已分配的PID,并在必要时进行回收。 2. Linux内核数据结构task_struct:task_struct是Linux...

    java雪花算法.zip

    此外,如果工作机器ID分配不当,可能导致ID空间浪费。 在实际应用中,雪花算法常被用在数据库主键生成、订单号生成、用户唯一标识等领域。`snowflakes`这个文件可能是一个Java实现雪花算法的源代码文件,它包含了...

    SimpleDht:基于Chord的简单DHT实现。 虽然设计是基于 Chord 的,但它是 Chord 的简化版。 手指表和基于手指的路由没有实现。 此外,不处理节点叶故障。 实现的三件事是1)ID空间分区重新分区,2)基于环的路由,以及3)节点加入

    简单Dht 基于Chord的简单DHT实现。 虽然设计是基于 Chord 的,但它是 Chord 的简化版。 手指表和基于手指的路由没有实现。... 实现的三件事是 1) ID 空间分区/重新分区,2) 基于环的路由,以及 3) 节点加入。

    P2P协议.doc

    连接和接收 Hello 消息时,双方 peer 都可以获取到共享的子协议信息,并达成一致关于消息 ID 空间的组成。 消息 ID 消息 ID 是从 ID 0x10 开始的紧凑型 ID,保留 0x00-0x10 区间用于 ÐΞVp2p 消息。每个共享的子...

    511-5G NR小区标识规划和计算.docx

    对于大规模网络,尤其是拥有众多小小区的陆地网络,可能需要更大的gNB ID空间。 在实际应用中,可以设定gNB ID的分配策略,比如将较低的ID分配给宏小区,而较高的ID留给小小区。例如,0到50000的gNB ID可以代表宏...

    windows事件ID及解释大全(非常完整).doc

    * 事件 ID 8:存储空间不足,无法处理此命令。 * 事件 ID 9:存储控制块地址无效。 * 事件 ID 10:环境不正确。 事件 ID 11-20 * 事件 ID 11:试图加载格式不正确的程序。 * 事件 ID 12:访问码无效。 * 事件 ID ...

    分布式三高架构设计实战

    2. 类Snowflake方案:这是一种根据时间戳、机器标识和自增序列号划分ID空间的算法。时间戳确保趋势递增,机器标识用于区分不同节点,自增序列号保证在同一毫秒内的ID唯一。这种方案灵活可扩展,QPS高,但同样面临...

    对等网络中dht算法研究

    DHT的核心是利用哈希函数将存储对象映射到一个大的ID空间,每个节点和数据都有唯一ID。节点ID由NodeID=Hash(Node)计算得出,数据ID由DataID=Hash(Data)计算。系统将ID空间划分为多个子空间,每个节点负责一部分,...

    Nchord c#编写

    Chord算法的核心思想是将网络中的节点分配到一个逻辑上的圆环(ID空间)中,并按照ID大小进行排序。每个节点负责存储一小段ID空间的数据,并知道其前继节点和后继节点的位置。通过简单的数学运算,Chord可以快速定位...

    读 ID 号 获得STM32F407 ID号的程序_获得STM32F407ID号的程序_

    2. **设置地址**:设备ID位于`0x1FFFF7E8`至`0x1FFFF7EC`的地址空间,其中前两个字节代表制造商ID,后两个字节代表设备ID。 3. **读取ID**:使用HAL库或者直接操作GPIO和内存映射接口来读取这些地址。如果是使用HAL...

Global site tag (gtag.js) - Google Analytics