【发布时间】:2019-07-05 06:34:57
【问题描述】:
如何构建带有下拉菜单的sweetalert2 消息的 R Shiny 版本。
我已经在 R Shiny 中构建了相当数量和类型的 sweetalert 消息,但这对我来说是一种新类型,我坚持正确的方式来从消息中的 selectinput 中以文本而不是数字的形式获取选择.
它在某种程度上可以工作,但输出是列表中第 n 个元素的数量而不是文本字符串.....
原始纯javascript示例:select下的example(发布在此消息的底部。
在我制作的演示应用程序吐出数字而不是文本之后,我尝试了这个:(按照我最终基于另一个关于 sweetalerts 的SO 问题构建的工作解决方案
myjava <- "shinyjs.swalFromButton = function(params) {
var defaultParams = {
title : null,
html : null,
inputOptions: null
};
params = shinyjs.getParams(params, defaultParams);
swal({title : params.title, html : params.html, inputOptions : params.inputOptions,
input: 'select',
inputPlaceholder: 'Select a batchname',
showCancelButton: true,
inputValidator: function(value) {
return new Promise(function(resolve) {
if (value === 'Select a batchname') {
resolve('You need to select a batchname')
} else {
resolve()
}
})
}
})
.then(function(result){
if(result.dismiss === swal.DismissReason.cancel) {
} else {
Shiny.setInputValue('SweetDropChoice', result.value, {priority: 'event'});
}
});
};"
我认为我的问题是,我不知道如何在我自己的版本中正确使用示例中的解析。
这是用于测试它的应用程序。您将需要更改目录并下载这两个文件以使 sweetalert2 工作
这里:https://www.jsdelivr.com/package/npm/sweetalert2,
下载按钮在标题右侧:sweetalert2
所需的 2 个文件位于 dist 文件夹中,名为:
sweetalert2.min.js & sweetalert2.min.css
setwd(PASTE LOCATION WHERE YOU SAVED THE SWEETALERT SCRIPTS)
library(shiny)
library(shinyjs)
myjava <- "shinyjs.swalFromButton = function(params) {
var defaultParams = {
title : null,
html : null,
inputOptions: null
};
params = shinyjs.getParams(params, defaultParams);
swal({title : params.title, html : params.html, inputOptions : params.inputOptions,
input: 'select',
inputPlaceholder: 'Select a batchname',
showCancelButton: true})
.then(function(result){
if (result.value === 'Select a batchname') {
resolve('You need to select a batchname:)')
} else {
var batchname = result.value
Shiny.setInputValue('SweetDropChoice', batchname, {priority: 'event'});}
});
};"
ui <- fluidPage(
actionButton(inputId = 'messagebutton', label = 'click me'),
verbatimTextOutput('Choice', placeholder = T),
shinyjs::useShinyjs(),
shinyjs::extendShinyjs(text = myjava),
tags$head(includeScript("sweetalert2.min.js"),
includeCSS("sweetalert2.min.css")
)
)
server <- function(input, output, session) {
values <- reactiveValues(Choice = '?',
Choices = rownames(mtcars)[1:6] ## dummy input to use in the sweetalert with dropdown
)
observeEvent(input$messagebutton, {
shinyjs::js$swalFromButton( title = paste('<span style ="color:#339FFF;">An alert with a choice'),
html = paste('Pick a name'),
inputOptions = values$Choices)
})
output$Choice <- renderPrint({input$SweetDropChoice}) ## print output of new sweetalert
}
shinyApp(ui = ui, server = server)
【问题讨论】:
-
result.value是选择的索引吗?在这种情况下,我会尝试将其替换为inputOptions[result.value]。 -
嘿 Stéphane,我几乎不明白我的两种方法的最后一部分做错了什么。我刚试过 var batchname = inputOptions[result.value];作为替换,但根本没有输出
-
不,抱歉,替换为
params.inputOptions[result.value]。还将if (result.value === 'Select a batchname')替换为if (result.value === '')。 -
好的,到了一半。我比我想象的要近。 params.inputOptions 有效,现在我得到了所需的文本输出,但是 if 语句还没有触发 sweetalert 中的红色警告栏
-
例如,在
.then(function(result){之后,我输入了console.log(result);。当我运行应用程序时,我会在 Chrome (Ctrl+Shift+i) 中打开 console。然后当按下 OK 按钮时,我可以在控制台中看到对象result。控制台也会显示错误。
标签: javascript r shiny sweetalert2