无法使用 RouterLink 在 Vaadin 中传递多个路径参数

Can't pass several path parameters in Vaadin using RouterLink

我是 Vaadin 的新手,正在尝试了解如何让 View 从 URL 获取多个参数。 例如

http://www.some.com/book/18/page/41

18号和41号是参数。

我发现我可以实现 HasUrlParameter<T> 然后使用 setParameter 方法,但它只能用于一个参数。

您是否在 setParameter 方法中使用了 @WildcardParameterWildcard URL parameters

假设greet(你的例子中的book)是路由,那么下面的代码设置了18\page。由于它是一个字符串,您需要对其进行解析并提取所需的值,但值就在那里。

@Route("greet")
public class WildcardGreeting extends Div
        implements HasUrlParameter<String> {

        @Override
        public void setParameter(BeforeEvent event,
                @WildcardParameter String parameter) {
                if (parameter.isEmpty()) {
                        setText("Welcome anonymous.");
                } else {
                        setText(String.format(
                                "Handling parameter %s.",
                                parameter));
                }
        }
}

P.S。与问题无关,但看你的URL,是不是查询参数更适合你Query parameters

Vaadin 不支持 Java 视图具有多个参数。你可以做的是用 @WildcardParameter 注释参数,这样可以将多个路径段捕获到一个参数中。然后,您将不得不手动管理该值的内容 - 在生成 URL 时连接字符串并解析 setParameter.

中的字符串

目前正在处理对多个参数的支持,但尚未完成。目前尚不清楚 Vaadin 的哪个未来版本将获得此功能,但我现在的猜测是版本 14.3 或 14.4。

带有解决方案的简单示例

@Route("book")
public class BookView extends Div implements HasUrlParameter<String> {
   
        @Override
        public void setParameter(BeforeEvent event, @WildcardParameter String parameter) {
            if (!parameter.isEmpty()) {
                String params[] = parameter.split("/");
                if (params.length == 1) {
                    // Do something ..
                } else if (params.length == 2) {
                    // Do another thing ..
                } else {
                    // Do something else
                }
            }
        }
}

link可以这样创建:

new RouterLink("No params", BookView.class);
new RouterLink("One param", BookView.class, "18");
new RouterLink("Two param", BookView.class, "18/edit");

Vaadin 14 似乎有更新并支持多路径参数。

示例:

@Route("user/:userID/:messageID/edit")
public class UserProfileEdit extends Div implements BeforeEnterObserver {

    private String userID;
    private String messageID;

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        userID = event.getRouteParameters().get("userID").get();
        messageID = event.getRouteParameters().get("messageID").get();
    }
}

来源:https://vaadin.com/docs/v14/flow/routing/tutorial-router-templates