R Shiny Datatable:防止再次选择已选择的行

时间:2018-08-29 21:07:10

标签: javascript r datatables shiny dt

R(3.4.1版) 我正在使用DT(版本1.0.5)中的DT(版本0.4)包,需要防止用户再次单击时取消选择已选择的行。例如,在下图中,如果用户再次单击第3行,则不应取消选择该行。但是,如果用户选择一个新行,则该新行将被选中,而前一行将被取消选择。

If user clicks on row 3 again it should not get deselected but if he clicks on a new row then that new row should get selected while deselecting the old one

我尝试使用shinyjs::onclick,如下所示,但这并不理想,因为它仅有助于重新选择单击的行,而不是防止取消选择。

library(shiny)
library(DT)
library(shinyjs)

shinyApp(
  ui <- shinyUI(
    fluidPage(
      shinyjs::useShinyjs(),
      DTOutput("test")
    )
  ),  
  server <- shinyServer(function(input, output, session) {

    output$test <- renderDT({
      datatable(head(iris), selection = 'single')
    })    
    shinyjs::onclick("test", selectRows(dataTableProxy("test"), selected = input$test_rows_selected))    
  })
)

我想知道是否有一种简单的方法来做到这一点。谢谢!

2 个答案:

答案 0 :(得分:2)

尝试在CSS中使用pointer-events: none

table.dataTable tbody tr.selected {
  pointer-events: none
}

唯一的限制是它可以防止在当前选定行上发生整个悬停/单击事件,因此您不能在具有悬停/可单击HTML内容的列上使用它。

希望对您有帮助!

答案 1 :(得分:0)

这只是部分解决方案(有关完整的解决方案,请参见下面的编辑。仅当您在行上单击两次时,它才起作用。在第三次单击时,该行被取消选择,我不知道为什么。也许datatables的专家可以提供帮助。

library(shiny)
library(DT)

shinyApp(
  ui <- shinyUI(
    fluidPage(
      DTOutput("test")
    )
  ),  
  server <- shinyServer(function(input, output, session) {

    output$test <- renderDT({
      datatable(head(iris), selection = list(mode="single", target="row"), 
                extensions = c("Select"), options = list(select=TRUE),
                callback = JS("
table.on('user-select', 
function (e, dt, type, cell, originalEvent) {
  if ($(cell.node()).parent().hasClass('selected')) {
    e.preventDefault();
  }
});"))
    })    
  })
)

编辑

我找到了一种解决方案(我不太了解)。

  server <- shinyServer(function(input, output, session) {

    output$test <- renderDT({
      datatable(head(iris), selection = list(mode="single", target="row", info=FALSE), 
                extensions = c("Select"), options = list(select=TRUE),
                callback = JS("
  table.on('user-select', 
    function (e, dt, type, cell, originalEvent) {
      if ($(cell.node()).parent().hasClass('selected') || e.result === undefined) {
        e.preventDefault();
        $(cell.node()).parent().addClass('selected')
        return false;
      }
    });")
      )
    })    
  })