2016-05-01 10 views
0

Ich möchte Tool Tipps zu einer dynamischen Benutzeroberfläche hinzufügen. Wenn ich initialisieren die Benutzeroberfläche die Tooltips arbeiten gutShinyBS bsPopover und updateSelectInput

selectInput(ns("Main2_1"),"Label","abc", selectize = TRUE, multiple = TRUE), 
bsPopover(ns("Main2_1"), "Label", "content", placement = "left", trigger = "focus"), 

aber sobald ich die Entscheidungen der Main2_1 in meinem Server-Skript mit

updateSelectInput(session, "Main2_1", choices=foo) 

verwenden aktualisieren löscht die Werkzeugspitze zu. Hinzufügen eines neuen Tooltip mit addPopover auf der Serverseite beseitigt nicht das Problem

Antwort

1

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)