0

動的なユーザー インターフェイスにツール ヒントを追加したいと考えています。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サーバー側で新しいツール ヒントを追加しても問題は解決しません

4

1 に答える 1

1

私は同意します、これはいくつかの貧弱なデザインです。なぜうまくいかないのか、私にはわかりaddPopoverません。オブザーバーがコマンドを1つずつ実行しないためかもしれません...

ただし、あなたのものに到達する方法があります。を書き換えることbsPopoverで、対応する要素の変更を考慮することができます。

updateResistantPopover追加の eventListener (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)
于 2016-05-11T16:31:59.013 に答える