我想向动态用户界面添加工具提示。当我初始化UI时,工具提示工作得很好
selectInput(ns("Main2_1"),"Label","abc", selectize = TRUE, multiple = TRUE),
bsPopover(ns("Main2_1"), "Label", "content", placement = "left", trigger = "focus"),但是,一旦我用以下方式更新服务器脚本中的Main2_1选项
updateSelectInput(session, "Main2_1", choices=foo)它也会删除工具提示。在服务器端添加一个带有addPopover的新工具提示并不能消除这个问题。
发布于 2016-05-11 16:31:59
我同意,这是个糟糕的设计。我甚至不知道,为什么addPopover不能工作。也许是因为观察者没有一个一个地执行命令..。
然而,有一种方法可以达到你的目的。通过重写bsPopover,我们可以考虑到相应元素的更改。
我创建了一个updateResistantPopover函数,它向元素添加了一个附加的eventListener (mutationListener),给出了id,每当元素的某些子元素发生更改时,该函数就会重新安装弹出函数。
下面是示例代码:
library(shiny)
library(shinyBS)
updateResistantPopover <- function(id, title, content, placement = "bottom", trigger = "hover", options = NULL){
options = shinyBS:::buildTooltipOrPopoverOptionsList(title, placement, trigger, options, content)
options = paste0("{'", paste(names(options), options, sep = "': '", collapse = "', '"), "'}")
bsTag <- shiny::tags$script(shiny::HTML(paste0("
$(document).ready(function() {
var target = document.querySelector('#", id, "');
var observer = new MutationObserver(function(mutations) {
setTimeout(function() {
shinyBS.addTooltip('", id, "', 'popover', ", options, ");
}, 200);
});
observer.observe(target, { childList: true });
});
")))
htmltools::attachDependencies(bsTag, shinyBS:::shinyBSDep)
}
ui <- shinyUI(fluidPage(
selectInput("Main2_1","Label","abc", selectize = TRUE, multiple = TRUE),
updateResistantPopover("Main2_1", "Label", "content", placement = "right", trigger = "focus"),
actionButton("destroy", "destroy!")
))
server <- function(input, output, session){
observeEvent(input$destroy, {
updateSelectInput(session, "Main2_1", choices="foo")
})
}
shinyApp(ui, server)https://stackoverflow.com/questions/36965954
复制相似问题