2016-03-03 56 views
1

我目前正在開發一個閃亮的小工具,並遇到了由renderUI()生成的Bootstrap彈出不會觸發的小問題。任何人都可以闡明爲什麼這可能是?R:Popovers不會在閃亮的反應式用戶界面中觸發

我對js不是很熟悉,所以我可能會對這個問題有一個明顯的答案,我很想念。

下面的例子重現了這個問題。簡而言之:創建一個呈現邊欄和情節的小工具;在側欄中有兩個鏈接標籤,它們會觸發一個彈出窗口,第一個在UI對象內生成,第二個鏈接標籤由uiOutput()renderUI()的組合生成。至少對我來說,反應性彈窗並不會觸發。

MWE:

library(shiny) 
library(miniUI) 

# Functions for popovers -------------------------------------------------- 

popoverInit <- function() { 
    tags$head(
    tags$script(
     "$(document).ready(function(){$('[data-toggle=\"popover\"]').popover();});" 
    ) 
) 
} 
popover <- function(content, pos, ...) { 
    tagList(
    singleton(popoverInit()), 
    tags$a(href = "#pop", `data-toggle` = "popover", `data-placement` = paste("auto", pos), 
      `data-original-title` = "", title = "", `data-trigger` = "hover", 
      `data-html` = "true", `data-content` = content, ...) 
) 
} 

# Gadget function --------------------------------------------------------- 

reactive_popovers <- function(data, xvar, yvar) { 

    ui <- miniPage(
    gadgetTitleBar("Reactive popovers"), 
    fillRow( # Sidebar and plot. 
     flex = c(1, 10), 
     tagList(
     tags$hr(), 

     ## This popover works fine: 
     popover("No problems", pos = "right", "Working popover"), 

     tags$hr(), 

     ## This one doesn't. 
     uiOutput("reactive_popover") 
    ), 

     ## A pointless plot. 
     miniContentPanel(
     plotOutput("plot", height = "100%") 
    ) 
    ) 
) 

    server <- function(input, output, session) { 

    ## Render popover. 
    output$reactive_popover <- renderUI({ 
     popover("Popover content", "right", "Dead popover") 
    }) 

    ## Render plot. 
    output$plot <- renderPlot({ 
     plot(mpg ~ hp, data = mtcars) 
    }) 
    } 

    runGadget(ui, server, viewer = browserViewer()) 
} 

reactive_popovers() 

回答

3

我認爲這正在發生的事情,因爲從renderUIpopoverjs後創建的綁定,所以它不會初始化。

繼從this post答案,你可以這樣做:

popoverInit <- function() { 
    tags$head(
    tags$script(
     "$(document).ready(function(){ 
     $('body').popover({ 
      selector: '[data-toggle=\"popover\"]', 
      trigger: 'hover'   
     });});" 
    ) 
) 
}