R блестящий запрос подтверждения перед закрытием приложения / вкладки

1

Я хочу отобразить модальное подтверждение до закрытия вкладки/приложения, но только если изменения действительно были внесены.

Я нашел некоторые полезные функции здесь, но они показывают модальные каждый раз, когда я хочу, чтобы закрыть/вкладку приложения. В приведенном ниже примере я использую goodbye -function от @Matee Gojra.

Я думал, что смогу послать логическое значение из R в JavaScript и выполнить функцию только в случае внесения изменений.

Но, очевидно, если я включу условие if в функцию, оно больше не будет работать.

Как я могу заставить эту работу или это не возможно нарочно?

library(shiny)

js <- HTML("
var changes_done = false;

Shiny.addCustomMessageHandler('changes_done', function(bool_ch) {
  console.log('Are changes done?');
  console.log(bool_ch);
  changes_done = bool_ch;
});

function goodbye(e) {
  if (changes_done === true) {
    if(!e) e = window.event;

    //e.cancelBubble is supported by IE - this will kill the bubbling process.
    e.cancelBubble = true;

    //This is displayed on the dialog
    e.returnValue = 'Are you sure you want to leave without saving the changes?';

    //e.stopPropagation works in Firefox.
    if (e.stopPropagation) {
      e.stopPropagation();
      e.preventDefault();
    }
  }
}

window.onbeforeunload = goodbye;
")


ui <- fluidPage(
  tags$head(tags$script(js)),
  actionButton("add_sql", "Make Changes"),
  verbatimTextOutput("sqls")
)

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

  sqlCmd <- reactiveVal(NULL)

  ## Simulate a Change
  observeEvent(input$add_sql, {
    sqlCmd(runif(1, 1, 1000))
  })

  output$sqls <- renderPrint({
    req(sqlCmd())
    sqlCmd()
  })

  ## Are changes made? Send to JS
  observe({
    if (!is.null(sqlCmd())) {
      session$sendCustomMessage("changes_done", 'true')
    } else {
      session$sendCustomMessage("changes_done", 'false')
    }
  })
}

shinyApp(ui, server)

Когда это условие if (changes_done === true) {} в JS-фрагменте закомментировано или удалено, модальное состояние появляется перед закрытием приложения, а с ним - нет.

Теги:

1 ответ

2
Лучший ответ

Вы должны использовать TRUE, а не 'true':

session$sendCustomMessage("changes_done", TRUE)

И FALSE, а не 'false'.

  • 0
    да;) это было легко исправить! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню