在我们的项目中,我们将ZK
用于网页。有combobox
列表。选中后,它通过onSelect
从java对象中获取数据,我给出了逻辑。
当我选择一个时,该页面上有4 listboxes
根据选择填充数据。当我第一次选择时,没有问题发生。
但是第二次我收到一个错误弹出窗口,例如“在窗口的id空间中不唯一”,并显示必须填写的列表框项目ID。
任何人都可以帮忙吗?
注意:虽然它显示此错误,但我会根据组合框选择正确填充listboxes
。我仍然无法阻止这种错误发生..
答案 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为其引发错误。