Shinyjs: [добавить | удалить] Класс не работает в модуле - PullRequest
0 голосов
/ 08 июня 2018

Фон

В моем модуле 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 Ответ

0 голосов
/ 15 июня 2018

Я полагаю, это вопрос области видимости.Самый простой способ сделать это - использовать shinyjs::runjs для непосредственного запуска соответствующего кода JavaScript.В вашем модуле используйте

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

Этот код точно так же, как toggleClass(class = "wait", selector = "body").

Этот ответ может помочь вам сделать это «блестящим способом»:

Наблюдение за событиями Блестящая функция, используемая в модуле, не работает

...