Vaadin Flow:设置标题

时间:2019-05-10 11:11:53

标签: vaadin vaadin-flow html-title

我目前正在尝试设置页面的title


场景

public class A extends FlexLayout implements RouterLayout {}

@Route(value = "b", layout = A.class)
public class B extends FlexLayout{}
@Route(value = "c", layout = A.class)
public class C extends FlexLayout{}

尝试

  1. 为此,我尝试在UI.getCurrent().getPage().setTitle("demo title")期间致电afterNavigation。不幸的是,这不适用于初始导航(也无法添加attachListener)。

  2. 我还尝试使用最外面的PageConfigurator上的RouterLayout来配置它,如下所示:

    @Override
    public void configurePage(InitialPageSettings settings) {
        settings.addMetaTag("title", "demo title");
        settings.addMetaTag("og:title", "demo title");

        settings.addFavIcon("icon", "frontend/images/favicon.ico", "48x48");
    }
  1. HasDynamicTitle似乎只有在实现类也定义了@Route而不是封装RouterLayout
  2. 时才起作用

问题

出于某种原因,Router本身会在导航期间设置标题。

Stacktrace of the setTitleCall

Router使用JS定义了标题并重新定义了document.title,而Page.setTitle似乎只修改了html.head.title标签。


问题

如何在单个位置设置标题?
如何防止Router表单将标题设置为当前URL的值?


注意

使用@PageTitle注释不是一种选择,因为在我的情况下,在编译时标题是未知的。

1 个答案:

答案 0 :(得分:0)

根据您的评论,我认为您是出于完全的原因以及其他可能为此而苦苦挣扎的人来弄清楚这是怎么回事:

Vaadin Flow官方文档建议使用HasDynamicTitle。 请参见以下示例:

@Route(value = "blog")
class BlogPost extends implements HasDynamicTitle, HasUrlParameter<Long> {
  private String title = "";

  @Override
  public String getPageTitle() {
    return title;
  }

  @Override
  public void setParameter(BeforeEvent event,
        @OptionalParameter Long parameter) {
    if (parameter != null) {
      title = "Blog Post #" + parameter;
    } else {
      title = "Blog Home";
    }
  }
}

如果您有静态的页面标题,则可以使用注释设置它:

@PageTitle("home")
class HomeView extends Div {

  HomeView(){
    setText("This is the home view");
  }
}

Source