我有一个服务器生成的侧边栏。创建完之后,我想隐藏它的第一个元素。执行隐藏操作的观察者被执行,但是菜单项未被隐藏。我试图弄清楚为什么它不起作用。有什么想法吗?
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)
答案 0 :(得分:1)
您的observeEvent
执行得太早了,因为在与trigger_sidebar_config
相同的cycle期间更新了无功值renderUI
。因此,Shiny会尝试隐藏尚不存在的UI元素(您必须等待呈现UI蜂声,而不是触发计算蜂声才能使它起作用)。
您可以进行测试,例如通过延迟shinyjs::hide
的执行-由actionButton
触发时有效(请参见下面的示例),或者您可以看看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()
。