当我打开一个modalDialog(通过点击一个"modal"按钮),里面有一个selectInput时,列表的第一个选择会显示出来,observeEvent会自动启动这个第一个元素。
如果我选择列表中的第二个元素,observeEvent会再次启动,这是正确的。
我"取消"或"关闭" modalDialog,然后通过单击主窗口中的"modal"按钮再次打开它。
列表中的第一个选项会再次显示,observeEvent会自动使用第一个元素启动。
现在我"取消"或"解散"这个modalDialog,而不选择selectInput的任何元素。
如果我再次打开modalDialog,什么也不会发生,因为第一个选择与我之前关闭modelDialog时相同,所以observeEvent没有检测到任何更改,因此它不会启动操作。
是否有办法重置selectInput或observeEvent,以便在modalDialog关闭时"忘记"先前选择的元素?即使selectInput仅包含一个选项,也必须这样做。
我尝试在modalDialog的页脚中添加一个actionButton,以便在关闭时启动一个操作:它用一个假值更新selectInput,但我不认为这是一个好方法...
这是一个可复制的代码,我设置了selectInput只有一个选择...
删除updateSelectInput前面的#以测试我的变通方案。
谢谢!
library(shiny)
ui <- fluidPage(
actionButton("open", "Modal")
)
server <- function(input, output, session) {
observeEvent(input$open, {
showModal(
modalDialog(
tagList(
div(id="choice",
selectInput(
"dateList", "History:",
choices = c("choice1")
)
)
)
,
footer = tagList(
actionButton("cancel","CANCEL"),
actionButton("save", "SAVE")
)
)
)
})
observeEvent( input$dateList,{
insertUI("#choice", ui=div("hello"))
})
observeEvent( input$cancel,{
removeModal()
#updateSelectInput(session, "dateList" , choices = c("fake"), selected = NULL)
})
}
shinyApp(ui, server)
1条答案
按热度按时间6g8kf2rb1#
有意思。这里有一个方法,但我不是很喜欢它,因为它会生成一个JavaScript警告。但不用担心,这个警告是无害的。
其思想是使用对
input$datelist
和input$cancel
都起作用的无功值。该警告是由于按下取消按钮时没有div
#choice
这一方面引起的。编辑
这里有一个更好的方法。没有警告,更清楚。我"重置"
input$dateList
,方法是在单击取消按钮时将其设置为NULL
,在此按钮的onclick
属性中使用一些JavaScript。我选择
NULL
是因为观察者不会对NULL
做出React(默认情况下),这就是为什么前面的警告不会在这里出现。