You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模态框内AceEditor结合rclipboard复制按钮失效问题求助

解决Shiny模态框中rclipboard复制按钮失效问题

问题背景

开发了结合aceEditor和rclipboard复制按钮的组件,独立运行时点击按钮可正常复制编辑器内代码;但将组件嵌套在多层动态UI(datatable按钮触发模态框,模态框内datatable点击后显示aceEditor与复制按钮)中时,复制按钮点击无反应且无报错。

失效原因

  1. 重复初始化rclipboard:在顶层UI、模态框、动态renderUI中多次调用rclipboardSetup(),导致JavaScript逻辑冲突,rclipboard仅需全局初始化一次。
  2. 动态UI渲染时机问题:模态框内的aceEditor为动态生成,直接将clipText绑定input$aceEdId时,可能因渲染顺序问题无法正确获取值,且rclipboard的点击事件未正确挂载到动态生成的按钮上。

解决方案

关键修改点

  • 仅在顶层UI中调用一次rclipboardSetup(),移除所有其他位置的该调用。
  • 使用reactive表达式跟踪aceEditor的内容,确保复制按钮能动态获取最新值。
  • 调整动态UI逻辑,保证内容传递的响应式。

修改后的完整代码

library(shiny)
library(shinyAce)
library(rclipboard)

shinyInput <- function(FUN, n, id, ...) {
  vapply(seq_len(n), function(i){
    as.character(FUN(paste0(id, i), ...))
  }, character(1))
}

ui<-fluidPage(
  DTOutput('tbl1'),
  rclipboardSetup() # 仅全局初始化一次
)

server <- function(input, output) {
  
  output$tbl1=renderDT({
    a=data.frame("col"=c(1))  
    a$btb=shinyInput(
      FUN = actionButton,
      n = nrow(a),
      id = 'btb_',
      label = "Button",
      onclick = 'Shiny.setInputValue("btn_Modal", this.id, {priority: "event"})',
    ) 
    a
  },selection = 'single',escape = FALSE)
  
  observeEvent(input$btn_Modal, {
    showModal(modalDialog(
      DTOutput('tbl2'),
      uiOutput('uiOut')
    ))
  })    
  
  # 响应式跟踪aceEditor内容,处理初始空值情况
  ace_content <- reactive({
    ifelse(is.null(input[["aceEdId"]]), "some code", input[["aceEdId"]])
  })
  
  observeEvent(input$tbl2_cell_clicked,{
    req(!is.na(input$tbl2_cell_clicked))
    
    output[["uiOut"]]<-renderUI({
      basicPage(
        aceEditor(
          outputId = "aceEdId",
          value = "some code"
        ),
        uiOutput("clip") 
      )
    })
  })  
  
  output$tbl2=renderDT({
    a=data.frame("col"=c(1))  
    a
  },selection = 'single')  
  
  output$clip <- renderUI({
    rclipButton(
      inputId = "clipbtn",
      label = "rclipButton Copy",
      clipText = ace_content() # 使用响应式内容
    )
  })

}

shinyApp(ui, server)

额外说明

如果仍存在问题,可尝试在模态框显示后手动触发rclipboard事件绑定,添加如下代码到observeEvent(input$btn_Modal, ...)中:

observeEvent(input$btn_Modal, {
  showModal(modalDialog(
    DTOutput('tbl2'),
    uiOutput('uiOut')
  ))
  # 手动触发rclipboard初始化
  session$sendCustomMessage(type = "rclipboard", message = list())
})

内容的提问来源于stack exchange,提问作者Lev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:25:56