闪亮:如何检测选择了哪些手风琴元素?

时间:2018-12-05 23:05:54

标签: javascript r shiny shinyjs

我有一个R Shiny,其中server.R输出大量动态生成的UI对象。

我认为我可以使用bs_accordion()包中的bsplus而不是处理input中的数百个对象。

我希望bs_accordion()通过server.R对象将其控制的元素的状态报告回input

我的计划是使用renderUI()仅针对当前选定的项目动态生成UI元素。

很不幸,据我所知,bsplus包中没有任何东西放入input中。

以下内容在浏览器控制台中有效(假设手风琴元素为MYACCORDION)...

MYACCORDION.onclick=function(){
Shiny.onInputChange('SELECTED_DIV',document.getElementsByClassName('in')[0].getElementsByClassName('shiny-input-container')[0].id
}

... in显然是bs类给出了手风琴中当前选择的元素,并且总是只有一个。因此,执行此操作后,只要选择了新内容,input$SELECTED_DIV就会得到更新。

但是我不能以编程方式执行上述操作。我尝试将其放在tags$script(...)末尾的fluidPage()中,但它没有附加到div上。我还尝试通过div(...,onclick=FOO)内联插入它,但是onclick的值在输出中被转义并且不解释为文本。

  • onclick中插入ui.R函数的正确位置在哪里?
  • 或者,如何强制将onclick属性的值视作原样,而不转义符号?
  • 或者已经有一个Shiny软件包,用于将Javascript函数附加到onclick事件上?

谢谢。

1 个答案:

答案 0 :(得分:1)

我建议设置一个虚拟输入,该输入将保留所选选项卡的当前值(在这种情况下为文本)。

这可能会帮助您:

library(shiny)
library(bsplus)

shinyApp(
  ui = fluidPage(
    tags$script("$(function() {
                  $('#meet_the_beatles a').on('click', function(x) {
                    Shiny.onInputChange('selected_tab', x.target.innerText)
                  });
                });"),

    fluidRow(
      column(
        width = 6,
        offset = 3,
        bs_accordion(id = "meet_the_beatles") %>%
          bs_append(title = "John", content = "Rhythm guitar, vocals") %>%
          bs_append(title = "Paul", content = "Bass guitar, vocals") %>%
          bs_append(title = "George", content = "Lead guitar, vocals") %>%
          bs_append(title = "Ringo", content = "Drums, vocals")
      )
    ),

    HTML("<input id='selected_tab' type='text' style='display: none;'")
  ),

  server = function(input, output, session) {
    observe({
      print(paste("The selected tab is", input$selected_tab))
    })
  }
)