R shinyjs模块中的show/hide功能无法正常工作

6
我希望通过使用 shinyjs 的 show 和 hide 功能来切换 UI 的各个部分。我需要在模块内部访问 UI 的一些部分,而这些部分位于模块外部。这种操作是否可行?
请参见附加的应用程序代码。主服务器端代码中的显示/隐藏按钮有效,但模块中的按钮无效。
感谢您的任何建议。
exampleUI <- function(id) {
            ns <- NS(id)
            tagList(actionButton(ns("hide_id"), "Module - Hide divs"),
                    actionButton(ns("show_id"), "Module - Show divs"),
                    uiOutput(ns("plot_id")))
    }
    
    shinyUI(fluidPage(
            shinyjs::useShinyjs(),
                    shinyjs::hidden(tags$div(id = "hidden", "hidden")),
                    tags$div(id = "shown", "shown"),
                    actionButton("hide_id", "Hide divs"),
                    actionButton("show_id", "Show divs"),
                    exampleUI("eg")))

    example <- function(input, output, session)
    {
        ns <- session$ns
        
        observeEvent(input$hide_id,
        {
            shinyjs::hide("hidden")
            shinyjs::hide("shown")
        })
        observeEvent(input$show_id,
        {
            shinyjs::show("hidden")
            shinyjs::show("shown")
        })
    }
    
    shinyServer(function(input, output) {
    
        callModule(example, "eg")
        observeEvent(input$hide_id,
        {
            shinyjs::hide("hidden")
            shinyjs::hide("shown")
        })
        observeEvent(input$show_id,
        {
            shinyjs::show("hidden")
            shinyjs::show("shown")
        })
    })

也许是连接的吗?https://github.com/daattali/shinyjs/issues/50 - Julian
1个回答

2
直到 2020年1月发布的v1.1版本,这是不可能的。该版本引入了参数asis。我引用:

asis=TRUE时,在模块内部使用ID时将不会添加命名空间。

下面是适应问答者代码的示例,展示了它的工作原理:

library(shiny)
library(shinyjs)

exampleUI <- function(id) {
  ns <- NS(id)
  tagList(actionButton(ns("hide_id"), "Module - Hide divs"),
          actionButton(ns("show_id"), "Module - Show divs"),
          uiOutput(ns("plot_id")))
}


example <- function(input, output, session)
{
  ns <- session$ns
  
  observeEvent(input$hide_id, {
                 shinyjs::hide("hidden", asis = TRUE)
                 shinyjs::hide("shown", asis = TRUE)
                 shinyjs::hide("plot_id")
               })
  observeEvent(input$show_id, {
                 shinyjs::show("hidden", asis = TRUE)
                 shinyjs::show("shown", asis = TRUE)
                 shinyjs::show("plot_id")
               })
  output$plot_id <- renderUI({
    "This is the module calling ..."
  })
}

UI <- function() {
  fluidPage(
    shinyjs::useShinyjs(),
    shinyjs::hidden(tags$div(id = "hidden", "hidden")),
    tags$div(id = "shown", "shown"),
    actionButton("hide_id", "Hide divs"),
    actionButton("show_id", "Show divs"),
    exampleUI("eg"))
}

server <- function(input, output, session) {
  
  callModule(example, "eg")
  observeEvent(input$hide_id, {
                 shinyjs::hide("hidden")
                 shinyjs::hide("shown")
               })
  observeEvent(input$show_id, {
                 shinyjs::show("hidden")
                 shinyjs::show("shown")
               })
}

shinyApp(UI, server)

exampleUImoduleServer() 在哪里? - kraggle
感谢您指出这一点。函数example()提供了服务器。但它不是教科书实现(至少不是最近的Shiny版本)。教科书样例通常在服务器模块函数内使用moduleServer()。在生产环境中,此函数仅调用callModule()。由于此示例在应用程序中显式调用了callModule(),因此仍然可以工作。只有当您想在MockShinySession中运行模块时,您需要重新设计并使其适应更近期的Shiny模块。 - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接