闪亮的仪表板-在服务器生成的侧边栏UI中隐藏menuitem

时间:2019-10-17 11:42:25

标签: r shiny shinydashboard

我有一个服务器生成的侧边栏。创建完之后,我想隐藏它的第一个元素。执行隐藏操作的观察者被执行,但是菜单项未被隐藏。我试图弄清楚为什么它不起作用。有什么想法吗?

PS。 CSS选择器似乎是正确的,因为在服务器上未创建UI时所有选择器都可以工作。

library(shiny)
library(shinyjs)
library(shinydashboard)


ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
      uiOutput("sidebar_ui")
    ),
    dashboardBody(
      shinyjs::useShinyjs()
    )
   )


server <- function(session, input, output) 
{ 
  rv <- reactiveValues()

  output$sidebar_ui <- renderUI({
    rv$trigger_sidebar_config <- 0
    cat("\nSidebar create")
    sidebarMenu(id = "sidebar",
                menuItem("Menu1", tabName = "tab_menu_1"),  # to be hidden
                menuItem("Menu2", tabName = "tab_menu_2") )
  })


  observeEvent(rv$trigger_sidebar_config, {
    cat("\nSidebar config")
    shinyjs::hide(selector = '[data-value="tab_menu_1"]')  # hide menuitem
  })
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

您的observeEvent执行得太早了,因为在与trigger_sidebar_config相同的cycle期间更新了无功值renderUI。因此,Shiny会尝试隐藏尚不存在的UI元素(您必须等待呈现UI蜂声,而不是触发计算蜂声才能使它起作用)。

您可以进行测试,例如通过延迟shinyjs::hide的执行-由actionButton触发时有效(请参见下面的示例),或者您可以看看reactlog

reactlog 在这里您可以看到,通过trigger_sidebar_config触发的watchEvent在3毫秒后完成了计算,但此时边栏尚未准备就绪(30毫秒)。

如果您希望在启动时隐藏该标签,则可以在hidden()调用中使用renderUI(请参阅Menu3):

library(shiny)
library(shinyjs)
library(shinydashboard)


ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    uiOutput("sidebar_ui")
  ),
  dashboardBody(
    shinyjs::useShinyjs(),
    actionButton("hide", "hide tab")
  )
)


server <- function(session, input, output) 
{ 
  rv <- reactiveValues()

  output$sidebar_ui <- renderUI({
    rv$trigger_sidebar_config <- 0
    cat("\nSidebar create")
    sidebarMenu(id = "sidebar",
                menuItem("Menu1", tabName = "tab_menu_1"),  # to be hidden
                menuItem("Menu2", tabName = "tab_menu_2"),
                shinyjs::hidden(menuItem("Menu3", tabName = "tab_menu_3")))
  })


  observeEvent(input$hide, {
    cat("\nSidebar config")
    shinyjs::hide(selector = '[data-value="tab_menu_1"]')  # hide menuitem
  })
}

shinyApp(ui, server)

在这种情况下,也请参见?renderMenu()

相关问题