3

我想根据盒子是否折叠在服务器端做一些操作。是否可以在服务器端知道闪亮仪表板中的框是否折叠?

[编辑]:

通过warmoverflow提供的链接并通过以下链接后,我想出了以下代码:

用户界面

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


ui <- shinyUI( dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(  

    useShinyjs(),
    extendShinyjs(text = jscode),

    box(id="box1", title = "BOX 1", collapsible = TRUE, collapsed = TRUE ),
    box(id="box2", title = "BOX2",  collapsible = TRUE, collapsed = TRUE),
    # a shiny element to display unformatted text
    verbatimTextOutput("results"),
    verbatimTextOutput("results1"),

    # # javascript code to send data to shiny server
    tags$script("
                document.getElementsByClassName('btn btn-box-tool')[0].onclick = function() {
                var number = document.getElementsByClassName('box-body')[0].style.display;
                Shiny.onInputChange('mydata', number);
                };
                "),

    tags$script("
                document.getElementsByClassName('btn btn-box-tool')[1].onclick = function() {
                var number = document.getElementsByClassName('box-body')[1].style.display;
                Shiny.onInputChange('mydata1', number);
                };
                "),

    actionButton("Collapse", "CollapseAll")

    )


    ))

服务器.R

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

jscode <- "
shinyjs.collapse = function(boxid) {
$('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
}
"


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

  output$results = renderPrint({
    input$mydata
  })

  output$results1 = renderPrint({
    input$mydata1
  })

  observeEvent(input$Collapse,{

    if(input$mydata == "none" || input$mydata == "")
    {
      js$collapse("box1")
    }


    if(input$mydata1 == "none" || input$mydata == "")
    {
      js$collapse("box2")
    }




  })

})

我想知道是否有更好的方法来做到这一点。除了为每个盒子添加 tags$script 之外,是否可以对代码进行更改,以便我们可以找出所有未折叠的盒子?

4

1 回答 1

0

根据您的问题,我不确定您是只想折叠所有展开的框还是做其他事情。您可以在 JS 代码中使用条件语句解决第一个问题。同样,您可以使用否定 ( ) 实现一个按钮来展开所有框if (!.....)

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

jscode <- "
shinyjs.collapse = function(boxid) {
if (document.getElementById(boxid).parentElement.className.includes('collapsed-box')) {
$('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
}
}"

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(  
    useShinyjs(),
    extendShinyjs(text = jscode),
    box(id="box1", title = "BOX1", collapsible = TRUE, collapsed = FALSE ),
    box(id="box2", title = "BOX2",  collapsible = TRUE, collapsed = FALSE),
    # a shiny element to display unformatted text
    actionButton("Collapse", "CollapseAll")
  ))

server <- shinyServer(function(input, output, session) {
  observeEvent(input$Collapse,{
    for (i in 1:2) {
      js$collapse(paste0('box',i))
    }
  })
})

shinyApp(ui = ui, server = server)
于 2020-10-07T09:53:14.677 回答