ShinyBS bsPopover и updateSelectInput

Я хочу добавить подсказки к динамическому пользовательскому интерфейсу. Когда я инициализирую пользовательский интерфейс, всплывающие подсказки работают нормально

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 на стороне сервера не устраняет проблему.


person user2963882    schedule 01.05.2016    source источник


Ответы (1)


Согласен, тут какой-то плохой дизайн. Я даже не могу сказать, почему addPopover не работает. Может быть, потому что наблюдатели не выполняют команды одну за другой ...

Однако есть способ добраться до своего дела. Переписывая bsPopover, мы можем учесть изменения соответствующего элемента.

Я создал функцию updateResistantPopover, которая добавляет дополнительный прослушиватель событий (mutationListener) к элементу, чей идентификатор указан, который повторно устанавливает всплывающее окно при изменении какого-либо дочернего элемента элемента.

Пример кода ниже:

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)
person K. Rohde    schedule 11.05.2016