【问题标题】:R Shiny - Trigger a shinyalert popup directly from the UI using javascriptR Shiny - 使用 javascript 直接从 UI 触发闪亮警报弹出窗口
【发布时间】:2020-02-05 01:59:06
【问题描述】:

使用以下代码,我可以通过单击 fileInput 的问号来触发纯 JavaScript alert

            fileInput('peptides', 
                      span("Peptides file  ",
                           id="peptidesSpan",
                           tags$a(
                             tags$i(class='fa fa-question-circle'),
                             href = "#",
                             onclick = "alert('Oops!'); return false;")
                      ),
                      multiple=FALSE,
                      accept = c('text/csv','text/comma-separated-values',
                      )
            )

我想知道我是否可以触发shinyalert 弹出窗口 (https://github.com/daattali/shinyalert/) 而不是直接形成 UI 的简单 javascript 警报,而无需服务器端的任何观察者。

类似:

shinyalert("Oops!", "Something went wrong.", type = "error")

如果没有解决方法可以做到这一点,也欢迎观察者提出任何其他建议。

【问题讨论】:

    标签: r shiny shinyalert


    【解决方案1】:

    我认为使用观察者一点也不方便。

    调用Shiny.setInputValue(id, value);,而不是alert(),然后在您的服务器端您可以observeEvent(input[id], { shinyalert() })

    阅读本文了解详情:https://shiny.rstudio.com/articles/communicating-with-js.html

    您只需要使用一个观察代码块即可实现此目的。

    一个例子

    在您的 UI Javascript 代码中定义一个自定义函数并在您的 onclick 中调用它。 您可以将此函数放在项目文件夹中“www”文件夹中的 helper.js 中,即www/helper.js。通过tags$head(tags$script(src = "helper.js"))将这个文件包含在你的 Shiny UI 代码中

    function showAlert(message, type = "info") {
      Shiny.setInputValue(
        'alertMessage',
        {
          message: message,
          type: type
        },
        { priority: 'event' }
      );
    }
    
    

    然后在 Shiny 服务器端定义一次观察者

    observeEvent(input$alertMessage, {
      alertData <- input$alertMessage
      req(alertData)
    
      shinyalert("title", alertData$message, type = alertData$type)
    })
    
    

    【讨论】:

      【解决方案2】:

      这是我回答自己帖子的少数几次之一,但在对 stack-overflow 进行了更多搜索后,我发现了一个受this 帖子启发的解决方法。

      1. 我直接从here下载了Sweet Alert库的sweetAlert.js文件
      2. 我在 Shiny 应用程序的根目录中创建了一个 www 文件夹
      3. 我在www 目录和ui.R 的dashboardBody() 中添加了sweetAlert.js 文件,我添加了以下行:

        tags$head(tags$script(src="sweetAlert.js"))

      现在我可以使用任何参数直接调用 Swal.fire 函数,就像我通常在任何其他运行 javascript 的框架中所做的那样。

      【讨论】:

      • 我刚刚意识到,如果我如上所述合并 sweetAlert.js 文件,server.R 中的 shinyalert() 函数将停止运行(可能是因为 sweetAlert.js 覆盖了useShinyalert()
      猜你喜欢
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多