Shinyjs:[add|remove]Class 在模块中不起作用
Shinyjs: [add|remove]Class does not work in a module
背景
在我的 shiny
模块中,我 运行 进行了冗长的计算。我想通过将光标更改为旋转的圆圈来向用户提供一些视觉反馈。为此,我创建了一个 css
class .wait
并希望在 body
上使用 shinyjs::addClass
来显示新光标。但是,在模块中这不起作用,而它在主应用程序中起作用。我怎样才能在我的模块中获得所需的行为?
代码
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)
我想这是一个范围界定问题。使这项工作最简单的方法是直接使用 shinyjs::runjs
到 运行 相应的 JavaScript 代码。在您的模块中,使用
observeEvent(input$wait, runjs(code = '$("body").toggleClass("wait");'))
observeEvent(input$stop, runjs(code = '$("body").toggleClass("wait");'))
此代码与 toggleClass(class = "wait", selector = "body")
完全相同。
这个答案可能会帮助您 "shiny way":
背景
在我的 shiny
模块中,我 运行 进行了冗长的计算。我想通过将光标更改为旋转的圆圈来向用户提供一些视觉反馈。为此,我创建了一个 css
class .wait
并希望在 body
上使用 shinyjs::addClass
来显示新光标。但是,在模块中这不起作用,而它在主应用程序中起作用。我怎样才能在我的模块中获得所需的行为?
代码
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)
我想这是一个范围界定问题。使这项工作最简单的方法是直接使用 shinyjs::runjs
到 运行 相应的 JavaScript 代码。在您的模块中,使用
observeEvent(input$wait, runjs(code = '$("body").toggleClass("wait");'))
observeEvent(input$stop, runjs(code = '$("body").toggleClass("wait");'))
此代码与 toggleClass(class = "wait", selector = "body")
完全相同。
这个答案可能会帮助您 "shiny way":