Отключить элементы, когда Shiny занят
Я использую кусок javascript
из этого вопроса: ТАК
Это работает для кнопок, но я также хотел бы отключить такие вещи, как 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 ответ
Я не могу помочь вам с кнопкой закрытия, хотя я узнал, что, как только вы установите 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
в конце.