Создание переменной javascript из настраиваемого сообщения в году

1

Я разрабатываю блестящее приложение, которое вводит пользовательский ввод, создает новое значение с этого ввода на стороне сервера и затем отправляет это значение для использования в каком-то пользовательском javascript-коде. Понятно, что для отправки сообщений от блестящих к javascript мне нужно использовать функцию session$sendCustomMessage() рядом с Shiny.addCustomMessageHandler() на стороне javascript. Пример приложения может выглядеть так:

library(shiny)

ui <- fluidPage(

  HTML(

  '<p id="insertion_target"></p>

  <script> 
            Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
              alert(message_from_r);
            }); 
            var insertion_text = "banana";
            document.getElementById("insertion_target").innerHTML = insertion_text;
  </script>'

  ),

  textInput("text", "Text", "Some_text"),
  actionButton("btn", "Send message")
)

server <- function(input, output, session) {
  observeEvent(input$btn, {
    modified_text <- paste(input$text, "_modified")
    session$sendCustomMessage("modified_text", modified_text)
  })
}

shinyApp(ui, server)

Поэтому я получаю предупреждение с измененным текстом и абзацем, который может быть нацелен на переменную javascript. Теперь я хочу сохранить это сообщение в глобальной переменной для использования в более позднем скрипте. В этом случае, заменив "banana" на message_from_r на внешнюю функцию javascript. Я бы предположил, что это должно работать:

library(shiny)

ui <- fluidPage(

  HTML(

  '<p id="insertion_target"></p>

  <script> 
            Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
            alert(message_from_r);  
            var insertion_text = message_from_r
            }); 
            document.getElementById("insertion_target").innerHTML = insertion_text;
  </script>'

  ),

  textInput("text", "Text", "Some_text"),
  actionButton("btn", "Send message")
)

server <- function(input, output, session) {
  observeEvent(input$btn, {
    modified_text <- paste(input$text, "_modified")
    session$sendCustomMessage("modified_text", modified_text)
  })
}

shinyApp(ui, server)

Или, альтернативно:

   library(shiny)

ui <- fluidPage(

  HTML(

  '<p id="insertion_target"></p>

  <script> 
            var insertion_text = Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
            alert(message_from_r);
            return message_from_r;
            }); 
            document.getElementById("insertion_target").innerHTML = insertion_text;
  </script>'

  ),

  textInput("text", "Text", "Some_text"),
  actionButton("btn", "Send message")
)

server <- function(input, output, session) {
  observeEvent(input$btn, {
    modified_text <- paste(input$text, "_modified")
    session$sendCustomMessage("modified_text", modified_text)
  })
}

shinyApp(ui, server)

Я сейчас смотрел на это некоторое время и пришел к выводу, что мой javascript плох. Пожалуйста помоги!

Теги:
shiny

1 ответ

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

Определите insertion_text вне обработчика сообщений. Таким образом, это глобальная переменная.

И вы можете вызвать пользовательское событие в body при отправке сообщения:

<script> 
  var insertion_text = null;
  Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
    alert(message_from_r);  
    insertion_text = message_from_r;
    $("body").trigger("myCustomEvent");
  }); 
  $("body").on("myCustomEvent", function(){
    document.getElementById("insertion_target").innerHTML = insertion_text;
  })
</script>
  • 0
    Это еще один подход , который я пытался, но по какой - то причине insertion_text не перезаписываются во время Shiny.addCustomMessageHandler вызова функции. Несмотря на то, что предупреждение возвращается корректным, insertion_text не изменяется глобально.
  • 0
    @MCWoodruff Я понимаю, что вы имеете в виду, и я думаю, почему, я думаю. Если вы переместите блок if внутри обработчика сообщений? На самом деле, я не знал, почему вы положили это на улицу, и мне было интересно.
Показать ещё 4 комментария

Ещё вопросы

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