以编程方式生成内容时,updateTabItems不起作用吗?

时间:2018-11-06 08:03:38

标签: r shinydashboard

我想以编程方式构建我的闪亮仪表板页面,并且还需要以编程方式更改显示的页面,例如成功登录后。我密切关注了?updateTabItems中的示例,但是以某种方式似乎以编程方式生成内容时updateTabItems无效。这是我的代码,按下登录按钮后没有显示page2。

# create ui that is created dynamically from server logic
ui <- dashboardPage(
  dashboardHeader(title = "switch tabs"),
  dashboardSidebar(sidebarMenu(sidebarMenuOutput("sidebarMenu"))),
  dashboardBody(uiOutput("body"))
  )

# build ui of login page
uiLogin = function(id) {
  ns = NS(id)
  actionButton( ns("loginButton"), "Login")
}

# server logic of login page
module = function(input, outpust, session) {

  # observe login button
  observeEvent(input$loginButton, {
    updateTabItems(session, "sidebarID", selected = "loginTab")
    cat("trying to switch tab\n")
  })
}

# server logic
server <- function(input, output, session) {

  # sidebar menu
  output$sidebarMenu <- renderMenu({
    sidebarMenu(
      id="sidebarID",
      menuItem("Login", tabName = "loginTab", selected=TRUE),
      menuItem("Page 2", tabName = "page2")
    )
  })

  # body
  output$body <- renderUI(
    tabItems(
      tabItem(tabName="loginTab", uiLogin("loginPage")),
      tabItem(tabName="page2", tags$h2("Page 2"))
      )
    )

  # server logic of login page
  callModule(module, "loginPage")
}

shinyApp(ui, server)

有趣的是,尽管在selected=TRUE中设置了tabItem,启动时甚至没有显示登录页面。我的闪亮版本为1.2.0,而闪亮仪表板位于0.7.1版本上。 我对如何以编程方式更新视图的任何建议深表赞赏?

1 个答案:

答案 0 :(得分:2)

在(我的)闪亮应用程序中,问题经常出在名称空间中。将父会话传递到登录页面的模块

# server logic of login page
callModule(module, "loginPage", session)

并在适当的命名空间中更新选项卡项可以更改选项卡

# server logic of login page
module = function(input, output, session, parentSession) {
  # observe login button
  observeEvent(input$loginButton, {
    updateTabItems(parentSession, "sidebarID", selected = "loginTab")
  })
}

我没有意识到在?updateTabItems中给出的示例中,边栏ID和模块位于相同的名称空间中,而在我的示例中该名称空间是不同的。