Лучший способ передать действие кнопки от одного модуля другому - PullRequest
1 голос
/ 06 апреля 2020

Я работаю над большим блестящим приложением, и я хотел бы включить модуль, который работает как меню. В этом модуле вы можете выбирать между другими автономными модулями и активировать один нажатием кнопки действия. Выбранный модуль будет отображаться как блестящий модал.

Однако я не могу найти хороший способ передать ввод кнопки действия от одного модуля другому, потому что, если я передам его как реактивное значение, он будет работать только один раз, но не второй раз после закрытия модуля. Я полагаю, что это связано с тем, что наблюдаемое событие не регистрирует никаких изменений в переданном реактивном значении.

Есть ли у вас какие-либо предложения по устранению этой проблемы? Нужен ли мне совершенно другой подход?

Вот рабочий пример:

# Load packages
library(shiny)

# mod_1 ui
# This modules task is to pass the button press to mod_3 in order to activate a modal there.
mod_1_ui <- function(id){

  ns <- NS(id)
  tagList(
    actionButton(ns("actionbtn_1"), label = "actionbtn_1")
  )
}

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

    fruit <- reactiveVal(value = NULL)

    observeEvent(input$actionbtn_1, {
      fruit("banana")
    })

    return(list(
      activate_1 = reactive({fruit()})
      ))
}

# mod_2 has no ui
# This modules' task is to recieve the action button press from mod_1 and activate the modal if it is pressed.
mod_2 <- function(input, output, session, activate_1, activate_2){

  modal <- function() {
    ns <- session$ns

    modalDialog(
      footer = actionButton(ns("close_modal"), label = "Close modal"),
      textOutput(ns("fruit"))
    )
  }

  observeEvent(activate_1(), {
    if(activate_1() == "banana") {
      showModal(modal())}   

    })

  observeEvent(input$close_modal, {

    removeModal()
  })

  output$fruit <- renderText({
    paste("first mod:", activate_1())
  })

}

# app ui
app_ui <- 
    fluidPage(
      fluidRow(
      mod_1_ui("mod_1")
      )
    )

# app server
app_server <- function(input, output,session) {
  rv <- callModule(mod_1, "mod_1")
  callModule(mod_2, "mod_2", activate_1 = rv$activate_1)
}

# running the app
shinyApp(app_ui, app_server)

1 Ответ

0 голосов
/ 30 апреля 2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...