Javascript Vaadin应用程序内的pendo或类似服务

Javascript Vaadin应用程序内的pendo或类似服务,javascript,vaadin,vaadin7,Javascript,Vaadin,Vaadin7,人们如何在Vaadin 7应用程序中使用?根据我目前的pendo知识,我知道需要做以下事情: 在每个页面上嵌入pendo JavaScript片段。因此,由于大多数Vaadin应用程序都是单页应用程序,我想这段代码需要加载到UI中,可能需要使用page.getCurrent().getJavaScript().execute或JavaScript.getCurrent().execute。我认为还有一个@JavaScript注释,但我已经尝试了几次,但都没有成功(请参阅和了解一个无法成功的地方)

人们如何在Vaadin 7应用程序中使用?根据我目前的pendo知识,我知道需要做以下事情:

  • 在每个页面上嵌入pendo JavaScript片段。因此,由于大多数Vaadin应用程序都是单页应用程序,我想这段代码需要加载到UI中,可能需要使用
    page.getCurrent().getJavaScript().execute
    JavaScript.getCurrent().execute
    。我认为还有一个
    @JavaScript
    注释,但我已经尝试了几次,但都没有成功(请参阅和了解一个无法成功的地方)
  • 通过调用pendo.Initialize({…});,初始化pendo;。我想这需要在通过
    JavaScript.getCurrent().execute
    登录到我的应用程序后完成(所以现在有用户id),但不完全确定在哪里执行。此外,根据Pendo的说法,它需要在每次重新加载windows时完成。我想我可以在我的UI类中这样做,只有在登录完成后才会发生。但在视图之间切换时是否也需要这样做?严格来说,这不是重新加载,所以只是不确定

  • 基本上,我发现有人在Vaadin应用程序中使用了Pendo,所以我希望能得到任何建议,特别是Pendo文档中尚未包含的建议。

    我对Pendo没有直接的经验,但使用了类似的产品WalkMe()。为了将其添加到页面中,我们执行了以下操作

  • 创建
    com.vaadin.server.VaadinServlet的自定义实现
  • 重写
    com.vaadin.server.VaadinServlet#servletInitialized
    ,在这里我们执行以下操作
  • @覆盖
    public void servletilized()抛出ServletException{
    super.servletilized();
    getService().addSessionInitListener(新的SessionInitListener(){
    @凌驾
    public void sessionInit(SessionInitEvent事件)引发ServiceException{
    event.getSession().addBootstrapListener(新的BootstrapListener(){
    @凌驾
    public void modifyBootstrapFragment(BootstrapFragmentResponse响应){
    }
    @凌驾
    public void modifyBootstrapPage(BootstrapPageResponse响应){
    如果(scripts.length!=0){
    ArrayUtils.reverse(脚本);
    for(字符串脚本:脚本){
    如果(!script.isEmpty()){
    response.getDocument().head().prependement(“脚本”).attr(“类型”,“文本/javascript”).text(脚本);
    }
    }
    }
    }
    } );
    }
    } );
    }
    
    • 要添加到头中的脚本通过构造函数基于自定义servlet实现
  • 使用带有@Configuration注释的类将CustomServlet注册为VaadinServlet类型的bean
  • @配置
    公共类VaadinConfig{
    @豆子
    公共VaadinServlet getVaadinServlet(){
    返回新的CustomServlet(新字符串[]{“实际的WalkMeScript”});
    }
    }
    
    为了让WalkMe了解它在哪个页面上以及接下来要突出显示哪个项目,我们在每个相关的Vaadin组件上引入了ID,然后在WalkMe脚本中使用这些ID


    另外,值得一提的是,我们使用的是Spring Boot,因此根据堆栈的不同,如何注册Servlet可能会有所不同

  • 基于这是一个单页应用程序这一事实,我按照指示,在我的参考资料目录中创建了一个
    pendo.js
    脚本。这个脚本只有第一个链接中的“片段的第1部分”,很明显我去掉了
    ,因为我把它自己放在了一个文件中
  • 在我的UI类中,我添加了
    @com.vaadin.annotations.JavaScript(“pendo.js”)
  • 登录后,我运行
    JavaScript.getCurrent().execute(pendoInitialization)
    ,其中“pendoInitialization”是上面第一个链接中请求的访问者和帐户信息,在我的例子中类似于
    pendo.initialize({visitor:{id:'VDR_JCARROS'},account:{id:'VEEDER'})

  • 这似乎很有效。

    请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。