ShinyBS bsPopover 和 updateSelectInput
ShinyBS bsPopover and updateSelectInput
我想向动态用户界面添加工具提示。
当我初始化 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
的新工具提示并不能消除问题
我同意,这是一些糟糕的设计。我什至不知道为什么 addPopover
不起作用。可能是因为观察者不会一一执行命令...
但是,有一种方法可以得到你的东西。通过重写bsPopover
,我们可以考虑相应元素的变化。
我创建了一个 updateResistantPopover
函数,它向元素添加了一个额外的 eventListener (mutationListener),whos id 已给定,当元素的某些子元素发生变化时,它会重新安装弹出窗口。
示例代码如下:
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)
我想向动态用户界面添加工具提示。 当我初始化 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
的新工具提示并不能消除问题
我同意,这是一些糟糕的设计。我什至不知道为什么 addPopover
不起作用。可能是因为观察者不会一一执行命令...
但是,有一种方法可以得到你的东西。通过重写bsPopover
,我们可以考虑相应元素的变化。
我创建了一个 updateResistantPopover
函数,它向元素添加了一个额外的 eventListener (mutationListener),whos id 已给定,当元素的某些子元素发生变化时,它会重新安装弹出窗口。
示例代码如下:
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)