Shinyjs:[添加|删除]类在模块中不起作用

tho*_*hal 4 r shiny shinyjs

背景

在我的shiny模块中,我进行了长时间的计算。我想通过将光标更改为旋转圆圈来向用户提供一些视觉反馈。为此,我创建了一个css.wait,并希望使用shinyjs::addClassbody显示新光标。然而,在模块内这不起作用,但它在主应用程序中起作用。如何将所需的行为添加到我的模块中?

代码

library(shiny)
library(shinyjs)

testUI <- function(id) {
   ns <- NS(id)
   tagList(useShinyjs(),
           inlineCSS('.wait {cursor: wait;};'),
           actionButton(ns("wait"), "wait"),
           actionButton(ns("stop"), "stop"))
}

test <- function(input, output, session) {
   observeEvent(input$wait,  addClass(selector = "body", class = "wait"))
   observeEvent(input$stop,  removeClass(selector = "body", class = "wait"))
}

ui <- fluidPage(
   useShinyjs(),
   testUI("test"),
   div("Test to show that 'wait' class works", class = "wait"),
   actionButton("wait.main", "wait"),
   actionButton("stop.main", "stop")
) 
server <- function(input, output, session) {
    callModule(test, "test")
    observeEvent(input$wait.main,  addClass(selector = "body", class = "wait"))
    observeEvent(input$stop.main,  removeClass(selector = "body", class = "wait"))
}

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

Mar*_*zer 5

我想这是一个范围界定问题。实现此工作的最简单方法是shinyjs::runjs直接运行相应的 JavaScript 代码。在您的模块中,使用

observeEvent(input$wait,  runjs(code = '$("body").toggleClass("wait");'))
observeEvent(input$stop,  runjs(code = '$("body").toggleClass("wait");'))
Run Code Online (Sandbox Code Playgroud)

这段代码的作用与 完全相同toggleClass(class = "wait", selector = "body")

这个答案可能会帮助您以“闪亮的方式”做到这一点:

模块中使用的observeEvent Shiny函数不起作用