2016-05-01 8 views
0

ダイナミックユーザーインターフェイスにツールヒントを追加します。 私はUIを初期化すると、ツールヒントが ShinyBS bsPopoverとupdateSelectInput

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

正常に動作しているが、私は

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

と私のサーバスクリプトでMain2_1の選択肢を更新するために使用したら、それはあまりにもツールチップを削除します。サーバー側にaddPopoverという新しいツールチップを追加しても問題は解決しません。

答えて

1

私は同意しています。私は言うことができない、なぜaddPopoverがうまくいかないのか。オブザーバーがコマンドを一つずつ実行しないかもしれないからかもしれません...

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

私は関数を作成しました。この要素は、要素の子が変わるたびにポップオーバーを再インストールする要素に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) 
関連する問題