Combobox ZK窗口在ID空间中不唯一

Combobox ZK窗口在ID空间中不唯一,combobox,listbox,zk,zul,Combobox,Listbox,Zk,Zul,在我们的项目中,我们对网页使用ZK。有一个包含列表的组合框。选中时,它通过选择从java对象获取数据,我已经给出了逻辑。 当我选择一个时,该页面上有4个列表框,将根据选择填充数据。当我选择第一次时,没有问题发生 但在第二次我得到一个错误弹出像“不唯一的id空间的窗口”,并显示列表框项目id必须填写在选择 有人能帮忙吗 注意:尽管显示了此错误,但我根据组合框选择正确填充了列表框。我仍然无法阻止这个错误的发生。您的问题是ZK的id空间中的id冲突 一点背景知识 ZK在运行时为组件生成id,如果您在浏

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

但在第二次我得到一个错误弹出像“不唯一的id空间的窗口”,并显示列表框项目id必须填写在选择

有人能帮忙吗


注意:尽管显示了此错误,但我根据组合框选择正确填充了
列表框。我仍然无法阻止这个错误的发生。

您的问题是ZK的
id空间中的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);
}
这将在您第一次单击“我的按钮”时起作用,但在第二次单击时会抛出错误。这是因为第二个事件试图将
myLabel
添加到
myWindow
中,但那里已经有一个
myLabel

有很多方法可以解决这个问题,具体取决于您要做什么。

查看上的ZK文档了解更多信息。

我也遇到了同样的错误。 我的场景是相同的,只是使用的小部件不同。 因此我把我的工作放在这里

我已将以下代码放在编写器的
doBeforeCompose()
方法中:

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

这里的
widgetWithId
是试图由代码重新生成的组件/小部件,具有相同的Id,ZK为其抛出错误。

您可以发布您的ZUL和可能的一些相关逻辑吗?如果您使用的是MVVM体系结构,那么不要在ZUL页面中使用Id属性