Ich stimme zu, das ist etwas schlechtes Design genau dort. Ich kann nicht einmal sagen, warum die addPopover
nicht funktioniert. Vielleicht, weil die Beobachter die Befehle nicht nacheinander ausführen ...
Es gibt jedoch einen Weg, um zu Ihrem Ding zu gelangen. Durch das Umschreiben der bsPopover
können Änderungen des entsprechenden Elements berücksichtigt werden.
Ich habe eine updateResistantPopover
-Funktion erstellt, die dem Element einen zusätzlichen eventListener (mutationListener) hinzufügt, dessen ID angegeben wird, der das Popover erneut installiert, wenn sich ein Kind des Elements ändert.
Beispiel-Code unten:
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)