ZK窗口在ID空间中不是唯一的

时间:2012-04-17 07:13:05

标签: combobox listbox zk zul

在我们的项目中,我们将ZK用于网页。有combobox列表。选中后,它通过onSelect从java对象中获取数据,我给出了逻辑。 当我选择一个时,该页面上有4 listboxes根据选择填充数据。当我第一次选择时,没有问题发生。

但是第二次我收到一个错误弹出窗口,例如“在窗口的id空间中不唯一”,并显示必须填写的列表框项目ID。

任何人都可以帮忙吗?

注意:虽然它显示此错误,但我会根据组合框选择正确填充listboxes。我仍然无法阻止这种错误发生..

2 个答案:

答案 0 :(得分:1)

您的问题是ZK id space中的ID冲突。

有点背景..

ZK在运行时为组件生成id,如果你在浏览器中打开DOM,你会发现每个组件都有一些机器可读的id。

但是,您也可以为组件提供ID。此ID不会转到DOM,但允许您在应用程序中引用该组件。

这两个不应该混淆。你遇到的冲突是后一种类型的id;您在Java代码或ZUL文件中为组件分配了一个id,在运行时,该ID不是唯一的。

您描述的情况只会在您第二次点击时发生,这是一个告诉故事标志。您在事件中添加的内容中定义了一个ID,并且在完成后您不会删除此内容。

考虑以下示例:

@Wire
private Window myWindow;

@Listen(Events.ON_CLICK + " = #myButton")
public void onMyButtonClicked() {
    Label myLabel = new Label("sean is cool");
    myLabel.setId("myLabel");
    myLabel.setParent(myWindow);
}

这将在您第一次点击myButton时生效,但会在第二次点击时抛出您的错误。这是因为第二个事件会尝试将myLabel添加到myWindow,但那里已经有myLabel

根据您的目的,有很多方法可以解决这个问题 请查看ID Spaces上的ZK文档了解更多信息。

答案 1 :(得分:0)

我也遇到了同样的错误。 我的情况是相同的,只是所使用的小部件不同。 因此,将我的解决方法放在这里。

我将以下代码放入了作曲家的doBeforeCompose()方法中:

Component widgetWithId = page.getFellowIfAny("widgetWithId");
if (widgetWithId != null) {
    widgetWithId.detach();
}

这里widgetWithId是组件/小部件,试图通过代码重新生成,具有相同的ID,并且ZK为其引发错误。