代码之家  ›  专栏  ›  技术社区  ›  thothal

shinyjs:[add remove]类在模块中不工作

  •  3
  • thothal  · 技术社区  · 6 年前

    背景

    在我的 shiny 模块我运行一个长度计算。我想通过将光标更改为旋转的圆来向用户提供一些视觉反馈。为此我创造了一个 css .wait 希望能利用 shinyjs::addClass body 显示新光标。但是,在一个模块中,这不起作用,而它在主应用程序中起作用。如何将所需的行为输入模块?

    代码

    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)
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Martin Schmelzer    6 年前

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

    observeEvent(input$wait,  runjs(code = '$("body").toggleClass("wait");'))
    observeEvent(input$stop,  runjs(code = '$("body").toggleClass("wait");'))
    

    此代码的作用与 toggleClass(class = "wait", selector = "body") .

    这个答案可能有助于你用“闪亮的方式”去做:

    observeEvent Shiny function used in a module does not work