Отключить элементы, когда Shiny занят - PullRequest
0 голосов
/ 13 сентября 2018

Я использую кусок javascript из этого вопроса: SO

Это работает для кнопок, но я также хотел бы отключить такие вещи, как sliderInput, selectInput и textInput также.

Я попытался заменить «кнопку» на «ввод», что отключает поля textinput.Мне интересно, есть ли способ отключить все элементы за 1 раз.

Большая проблема заключается в следующем: когда вы открываете 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)

1 Ответ

0 голосов
/ 14 сентября 2018

Я не могу помочь вам с кнопкой закрытия, хотя я обнаружил, что как только вы установите дескриптор shiny:idle, любой вызов JavaScript будет запускать shiny:idle и, следовательно, запускать обработчик вместо кода JavaScript, стоящего за toggleDropdownButton.

Однако, первый вопрос о том, как выбрать более одного элемента в вашем 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 в конце.

...