如何在 zk 中找到给定组件的根组件?

How do I find the root component of a given component in zk?

在我的视图模型中,我有以下代码:

@Command
public void onFinish(@BindingParam(value = "myButton") Button myButton) {
        Component root = myButton.getParent().getParent().getParent();
        ...
}

是否有更优雅的方法来查找任何给定组件的根组件?每次更改 zul 时都必须更改上面的表达式。

P.S。我是 zkoss 的新手..:)

假设您的根组件有一个 id,您可以执行以下操作:

Component root = myButton.getPage().getFellow("id-of-root-component");

这完全取决于您的组件的根。

您的根通常是 IdSpace,如果您没有设置其他 IdSpace 元素,您可以使用:

@Command
public void onFinish(@ContextParam(ContextType.SPACE_OWNER) IdSpace spaceOwner) {

    ...
}

这样,您就不必在 zul 中传递任何内容。
它会自动获取该组件。 请记住,IdSpace 是在某些特定组件中实现的接口。

Please take a look of the other,也许更适合你的情况,你可以做的选择。

但是有also other tricks,这个用了CSS个选择器:

@Command
public void onFinish(@SelectorParam(":root") Component root) {
    ...
}

这样你就永远拥有根

我不太喜欢使用绑定参数将组件从视图发送到视图模型。
原因是今天,你从一个按钮调用这个命令,但也许你在其他组件上添加了相同的命令,然后这将失败。
是的,您可以使用 Component class,但是 MVVM 有很多方法可以更好地做到这一点而不会污染您的视图。
请记住,MVVM 的重点是 UI 和代码之间的分离。
触发命令的内容可能无关紧要,即使 collection 将在屏幕上填充什么也无关紧要。