更新闪亮仪表板的文本::menuItem

问题描述 投票:0回答:1

我正在尝试为

shinydashboard
menuItem
实现反应式文本,而无需在
renderMenu
中使用
server
。原因是每次渲染菜单时,都会将菜单中的所有项目重置为默认值。然而,其中一些也是反应性的,例如
actionbutton
在发生事件时被禁用。

我怀疑这对于

runjs
来说是可能的,但我不知道如何正确处理特定 id 的菜单项的文本。我无法使用
isolate
来处理我不想在
renderMenu
中做出反应的事情;当我尝试这样做时,我遇到了错误。

下面的示例是不需要的,因为每次渲染菜单时,它都会重置所有内容,无论项目随后如何更改。在此示例中,按钮和复选框将重置为

enabled
状态,尽管在单击按钮时禁用它们。相比之下,为了说明我的意思,菜单 1 中的按钮和复选框保持禁用状态。

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

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(
    menuItem(
      "Menu1",
      actionButton("dummy1", "Dummy Button 1"),
      checkboxInput('dummy3', 'Dummy 3')
      ),
    menuItemOutput('menu2')
    )
  ),
  dashboardBody(
    shinyjs::useShinyjs(),
    textInput("name", label='New Menu Label', value = ""),
    actionButton("update", "Update Label")
    )
)
  
server <- function(input, output, session){
  
  menulabel<-reactiveVal('Menu2')
  
  output$menu2<-renderMenu({
    menuItem(
      menulabel(),
      actionButton('dummy2', 'Dummy Button 2'),
      checkboxInput('dummy4', 'Dummy 4')
    )
  })
  
  observeEvent(input$update,{
    menulabel(input$name) #instead of a reactive label and renderMenu(), use runjs() here?
    shinyjs::disable('dummy1')
    shinyjs::disable('dummy2')
    shinyjs::disable('dummy3')
    shinyjs::disable('dummy4')
  })
}

shinyApp(ui, server)
r shiny shinydashboard
1个回答
0
投票

您可以做的就是取出您的

span
中的第一个
menu2
并更新其
html()
。因此您可以将
menulabel(input$name)
替换为

runjs(paste0("$('#menu2 span').first().html('", input$name, "')"))

© www.soinside.com 2019 - 2024. All rights reserved.