【问题标题】:Sweetalert2 message with dropdown in R shinySweetalert2 消息与 R 中的下拉菜单闪亮
【发布时间】: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


【解决方案1】:

这是我的版本。但据我所知,这和你的一样。除了我没有包含if(result.dismiss === swal.DismissReason.cancel)(顺便说一句,我不确定这是否正确,result 中没有dismiss 字段)。

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 !== '') {
          resolve();
        } else {
          resolve('You need to select a batch :)');
        }
      });
    }
  })
  .then(function(result){
    var batchname = params.inputOptions[result.value];
    Shiny.setInputValue('SweetDropChoice', batchname, {priority: 'event'});
  });
};"

【讨论】:

  • 你是对的。它实际上不需要在那里(解雇部分)。你和我的不同之处在于,当涉及到 javascript 时,我只是在复制和尝试,而你可能知道自己在做什么。我不知道 return new Promise(function(resolve) { 行的确切作用以及我们为什么需要它
  • 最后你的result.dismiss 似乎是正确的(这里有一些例子sweetalert2.github.io)。老实说,我真的不知道我在用 Javascript 做什么。我正在使用一些示例和控制台进行调试。例如我不完全理解Promise
  • 好吧,尽管我们缺乏知识,但我们组建了一支伟大的团队哈哈。下一个挑战,弄清楚如何使用 css 在我的应用中将 sweetalert 稍微靠左一点
  • 感谢 Stephane 今天的意见。和对齐; tags$head(tags$style(HTML(' .swal2-modal {left : -440px}'))),似乎可以做到
【解决方案2】:

@Stéphane 奇怪的是,我现在可以使用另一个版本...

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 === '') {
resolve('You need to select a batchname')
} else {
resolve()
}
})
}
})
.then(function(result){
if(result.dismiss === swal.DismissReason.cancel) {
} else {
var batchname = params.inputOptions[result.value];
Shiny.setInputValue('SweetDropChoice', batchname, {priority: 'event'});
}
});
};"

【讨论】:

  • 我正要发布一个答案...是的,我还包括了这个inputValidator,这很有效。
  • 继续发布吧。我很想知道这些差异,你应该得到我那里的声誉积分
猜你喜欢
  • 2021-05-01
  • 2019-11-26
  • 2018-11-18
  • 2016-12-09
  • 2015-01-11
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多