updateTabItems не работает при программной генерации контента? - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу создать свою страницу Shinydashboard программно, а также мне нужно программно изменить показанную страницу, например, после успешного входа. Я внимательно следил за примером в ?updateTabItems, но почему-то кажется, что updateTabItems не работает, когда контент генерируется программно. Вот мой код, который не показывает страницу 2 после нажатия кнопки входа в систему.

# 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 и Shinydashboard на версии 0.7.1. Любые предложения, как я могу обновить представление программно, очень ценятся?

1 Ответ

0 голосов
/ 15 декабря 2018

Как часто в (моих) блестящих приложениях, проблема была в пространстве имен. Передача родительского сеанса в модуль страницы входа в систему

# 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, идентификатор боковой панели и модуль находятся в одном и том же пространстве имен, тогда как пространство имен в моем примере было другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...