Несколько кнопок в DataTable, вызывающих один и тот же modalDialog - Shiny - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю блестящую приборную панель, содержащую данные.В этом Datatable я создал столбец, который содержит кнопки с одинаковым идентификатором 'inf' (используя параметры columnDefs) и обработал событие кнопок, используя onclick(), чтобы открыть определенный modalDialog (код ниже).Проблема в том, что, поскольку все мои кнопки имеют одинаковый идентификатор, функция onclick работает только в одной кнопке (см. Демо ).Так как же я могу заставить все кнопки открывать один и тот же модальный диалог?Или как мне назначить разные идентификаторы для кнопок?

server.R

df = mtcars
df$Description = NA
df = df[,c(12,1,2,3,4,5,6,7,8,9,10,11)]

output$table <- DT::renderDataTable(
  df, 
  options = list( paging = FALSE, scrollY = 354,
                  initComplete = JS(
                          "function(settings, json) {",
                          "$(this.api().table().header()).css({'background-color': 'white', 'color': 'black', 'font-weight' : 'bold'});",
                      "}"),
                  columnDefs = list(
                      list(className = 'dt-center',
                           targets = 1,
                           data = NULL, 
                           defaultContent = "<button id='inf' type='button' class='btn btn-default action-button shiny-bound-input'><i class= 'fa fa-question-circle'/></button>"
                           )
                  )
             ),
  selection = 'single',
  style = 'bootstrap'
)

onclick("inf",{
    showModal(
      modalDialog( h4(input$table_rows_selected))
    )
  })

1 Ответ

0 голосов
/ 21 января 2019
library(shiny)
library(DT)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  DTOutput("table")
)

server <- function(input, output){
  df = mtcars
  df$Description = sapply(1:nrow(df), function(i){
    sprintf("<button id='inf%d' type='button' class='btn btn-default action-button shiny-bound-input'><i class= 'fa fa-question-circle'/></button>",i)
  })
  df = df[,c(12,1,2,3,4,5,6,7,8,9,10,11)]

  output$table <- renderDT(
    df, escape = FALSE,
    options = list( paging = FALSE, scrollY = 354,
                    initComplete = JS(
                      "function(settings, json) {",
                      "$(this.api().table().header()).css({'background-color': 'white', 'color': 'black', 'font-weight' : 'bold'});",
                      "}")
    ),
    selection = 'single',
    style = 'bootstrap'
  )

  for(i in 1:nrow(df)){
    onclick(paste0("inf",i), {
      showModal(
        modalDialog( h4(input$table_rows_selected))
      )
    })
  }
}

shinyApp(ui, server)
...