【问题标题】:pendo or similar service inside Vaadin appVaadin 应用程序中的 pendo 或类似服务
【发布时间】:2021-05-13 15:21:54
【问题描述】:

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

  1. 在每个页面上嵌入 pendo JavaScript sn-p。所以,由于大多数 Vaadin 应用程序都是单页应用程序,我猜这个 sn-p 需要在 UI 中加载,可能使用Page.getCurrent().getJavaScript().executeJavaScript.getCurrent().execute。我认为还有一个 @JavaScript 注释,但我已经尝试了几次,但无法使其工作(请参阅 herehere 了解我无法使其工作的一个地方)。李>
  2. 通过调用 pendo.initialize({...}); 来初始化 pendo。我想这需要在通过JavaScript.getCurrent().execute 登录我的应用程序(此时有用户 ID)后完成,但不完全确定在哪里执行此操作。此外,根据 Pendo 的说法,每次重新加载 Windows 时都需要执行此操作。我想我可以在我的 UI 类中做到这一点,只有在登录完成后才会发生。但是在视图之间切换时我也需要这样做吗?严格来说,这不是重新加载,所以不确定。

基本上,我发现有人在 Vaadin 应用程序中使用了 Pendo,因此寻找我能得到的任何建议,尤其是尚未包含在 pendo 文档中的建议。

【问题讨论】:

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

标签: javascript vaadin vaadin7


【解决方案1】:

我没有使用 Pendo 的直接经验,但我使用了一个名为 WalkMe (https://www.walkme.com/) 的类似产品。为了将其添加到页面,我们执行了以下操作

  1. 创建com.vaadin.server.VaadinServlet 的自定义实现
  2. 覆盖com.vaadin.server.VaadinServlet#servletInitialized,这里我们执行以下操作
@Override
    public void servletInitialized () throws ServletException {
        super.servletInitialized ();

        getService ().addSessionInitListener ( new SessionInitListener () {

            @Override
            public void sessionInit ( SessionInitEvent event ) throws ServiceException {

                event.getSession ().addBootstrapListener ( new BootstrapListener () {

                    @Override
                    public void modifyBootstrapFragment ( BootstrapFragmentResponse response ) {
                    }

                    @Override
                    public void modifyBootstrapPage ( BootstrapPageResponse response ) {

                        if ( scripts.length != 0 ) {
                            ArrayUtils.reverse ( scripts );
                            for ( String script: scripts ) {
                                if ( !script.isEmpty () ) {
                                    response.getDocument ().head ().prependElement ( "script" ).attr ( "type", "text/javascript" ).text ( script );
                                }
                            }
                        }
                    }
                } );
            }
        } );
    }
  • 要附加到标头的脚本基于通过构造函数实现的自定义 servlet
  1. 使用带有 @Configuration 注释的类将 CustomServlet 注册为 VaadinServlet 类型的 bean
@Configuration
public class VaadinConfig {

    @Bean
    public VaadinServlet getVaadinServlet () {
        return new CustomServlet ( new String [] { "The actual WalkMeScript" } );
    }


}

为了让 WalkMe 了解它所在的页面以及接下来要突出显示的项目,我们在每个相关的 Vaadin 组件上引入了 ID,然后在 WalkMe 脚本中使用这些 ID

附:值得一提的是,我们使用的是 Spring Boot,所以如何注册 Servlet 可能因您的堆栈而异

【讨论】:

    【解决方案2】:

    这是我最终做的:

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

    这似乎运作良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2011-05-03
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多