R语言 spsComps库只放大一次

1hdlvixo  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(205)

我有一个应用程序可以打开一个modalDialog,里面有一个图像。但是,只有在第一次打开模态时,放大才起作用。如何修复这个问题?下面是一个最小的reprex:

library(shiny)
library(spsComps)

ui <- fluidPage(
  actionButton("modal", "Open modal")
)

server <- function(input, output, session) {
  
  observeEvent(input$modal,
               {
                 showModal(modalDialog(
                   title = "test",
                   fluidRow(gallery(
                     texts = "Click to enlarge", hrefs = "", image_frame_size = 6, 
                     images = "https://cdn.pixabay.com/photo/2018/07/31/22/08/lion-3576045__340.jpg",
                     enlarge = TRUE, title = "When you close this modal, the enlargement does not work again",
                     enlarge_method = "modal"
                   )),
                   footer = modalButton("Cerrar"),
                   easyClose = TRUE,
                   size = "xl"))
               })
  
}
shinyApp(ui, server)

第一次打开模态时,您可以通过单击它来放大图像。它看起来像这样:

但是,当您***关闭然后重新打开模态***时,该放大功能丢失。

g52tjvyc

g52tjvyc1#

一个临时的解决方案是:

library(shiny)
library(spsComps)

ui <- fluidPage(
    actionButton("modal", "Open modal"),
    singleton(
        div(id = "sps-gallery-modal", class = "gallery-modal", 
            style="display: none;",
            onclick = "galModalClose()", tags$span(class = "gallery-modal-close", "X"), 
            tags$img(id = "sps-gallery-modal-content", 
            class = "gallery-modal-content"), 
            div(class = "gallery-caption")
   ))
)

server <- function(input, output, session) {
    
    observeEvent(input$modal,
                 {
                     showModal(modalDialog(
                         title = "test",
                         fluidRow(gallery(
                             texts = "", hrefs = "", image_frame_size = 6, 
                             images = "https://cdn.pixabay.com/photo/2018/07/31/22/08/lion-3576045__340.jpg",
                             enlarge = TRUE, title = "When you close this modal, the enlargement does not work again",
                             enlarge_method = "modal"
                         )),
                         footer = modalButton("Cerrar"),
                         easyClose = TRUE,
                         size = "xl"))
                 })
    
}
shinyApp(ui, server)

原因是我在图库创建功能中有这个singleton(...,不管你有多少图库,只需要创建一个放大img容器(同时放大两张图片是不切实际的)。因此,来自不同图库的放大图像会显示在同一个放大容器中。这样可以节省计算机资源。而Shiny中的singleton是防止重复的函数,即使你可以多次调用gallery,如果singleton中的内容只被发送到DOM树一次,它也不会再次追加。
问题是当showModal关闭时,Shiny会删除modal中的所有内容,包括图库singleton内容。同时,我认为singleton内容验证停留在R级别。它实际上不会搜索DOM树,以确定该内容是否存在。因此,Shiny认为singleton内容存在。因此在第二次调用showModal时拒绝将其发送到DOM。
上述修复将singleton内容附加到fluidPage容器,而不是Shiny模态容器,因此当模态关闭时,无法删除内容。
当你有singletonmodalDialog的时候,这是一个普遍的问题。我没有什么可以做来修复Shiny,但是我可能会在下一个spsComps版本中想到一个更用户友好的方法来解决它。

相关问题