【问题标题】:Disable elements when Shiny is busyShiny忙时禁用元素
【发布时间】:2019-02-18 04:22:27
【问题描述】:

我正在使用来自这个问题的javascriptSO

它适用于按钮,但我也想禁用 sliderInputselectInputtextInput 之类的东西。

我试图用“输入”替换“按钮”,这确实禁用了textinput 字段。我想知道是否有一种方法可以一次性禁用所有元素。

更大的问题是: 当您打开 dropdownbutton 时,关闭按钮通常应该删除 modal dialog,以防 javascript 标记从下面的演示应用程序中删除。但是,当脚本在应用程序中时,关闭按钮由于某种原因不再起作用。它仍然打印文本命令,这意味着它被观察到了,但模式没有关闭。对话框中的另一个按钮仍然正常工作。

应用程序:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  h3('Disable buttons while running'),
  actionButton('btn_run','Run long process'),
  hr(),
  h3('Inputs'),
  actionButton('btn1','Button 1'),
  hr(),
  textInput('text1', 'Text1',"my text:"),
  hr(),
  selectInput('select1', 'Selectinput', choices = c('A', 'B', 'C'), selected = 'A'),
  hr(),
  h5('Dropdown'),
  dropdownButton(inputId = "MyDropDown",
                 h3("This is a dropdown"),
                 actionButton('btn_run2','Run other long process'),
                 fluidRow(actionButton( "CloseDropDown", "Close"), style = "float: right; margin-right:10px"),
                 icon = icon("tasks"),
                 tooltip = tooltipOptions(title = "Click to open"), width = "500px"),
  hr(),
  sliderInput('slid3','Slider 1',min=0,max=1,value=0.5),


tags$script(HTML("$(document).on('shiny:busy', function() {
  var inputs = document.getElementsByTagName('button');
console.log(inputs);
for (var i = 0; i < inputs.length; i++) {
inputs[i].disabled = true;
}
});

$(document).on('shiny:idle', function() {
var inputs = document.getElementsByTagName('button');
console.log(inputs);
for (var i = 0; i < inputs.length; i++) {
inputs[i].disabled = false;
}
})" ))
)

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

  observeEvent(input$btn_run,{
    Sys.sleep(5)
  })


  observeEvent(input$btn_run2,{
    Sys.sleep(5)
  })

  observeEvent(input$CloseDropDown, {print('closing?')
    toggleDropdownButton(inputId = 'MyDropDown') })

}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: javascript r shiny dropdownbutton


    【解决方案1】:

    我无法为您提供关闭按钮,尽管我发现一旦您设置了 shiny:idle 句柄,任何对 JavaScript 的调用都会触发 shiny:idle 并因此运行处理程序而不是 @987654323 后面的 JavaScript 代码@。

    然而,如何在 JavaScript 中选择多个元素的第一个问题可以通过 jQuery 解决。将代码更改为

    $(document).on('shiny:busy', function() {
      var $inputs = $('button,input');
    console.log($inputs);
    $inputs.prop('disabled', true);
    });
    
    $(document).on('shiny:idle', function() {
    var $inputs = $('button,input');
    console.log($inputs);
    $inputs.prop('disabled', false);
    })
    

    您可以选择按钮和文本输入。现在您可以自己找出要使用哪些代码来禁用下拉菜单。

    顺便说一句:也许你想看看shinyjs::disable。使用此功能,您可以从R 端禁用您的控件。您可以将其放在长计算的开头并在末尾使用 shinyjs::enable

    【讨论】:

    • 您能确认关闭按钮不起作用吗? Shinywidgets的制造商说要下载github版本,但这对我也没有解决
    • 是他推送最新版本的问题。现在通过运行 devtools::install_github("dreamRs/shinyWidgets") 修复
    • 知道哪些关键字针对滑块和选择输入吗?很难找到他们
    • shinyjs::disable 和 enable 我也顺便使用了,但它们不适用于“忙”。该应用程序可以在几秒钟内计算我的整个模型和绘图,但绘图的渲染有时需要 30 秒(Plotly 使用起来非常繁重),并且 R 会认为在应用程序停止忙碌之前很久就可以启用。 javascript 解决方案虽然完美。现在只需要找到合适的标签来定位
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2017-03-07
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多