textArea的闪亮绑定 - 无法设置初始值

时间:2015-02-08 06:16:38

标签: javascript r tags shiny

我在Shiny应用程序中使用textArea来为dplyr的过滤器动词提供输入。我使用闪亮的绑定,因此只有在按下返回键后输入才会传递给dplyr。这很好用,除了我不能为textArea设置初始值。不幸的是,这在我的应用程序中至关重要,因为它是我依赖的保存和恢复状态的功能。我可以设置文本输入的初始值(returnTextAreaInput1),但不能设置文本区域的初始值(returnTextAreaInput2)。

在我使用的R和js代码下面。如果从桌面运行代码,您将看到text_out1显示初始值,而text_out2则没有。不幸的是我需要一个textarea。

enter image description here

returnTextAreaInput1 <- function(inputId, label, value = "") {
  tagList(tags$label(label, `for` = inputId), br(),
          tags$input(id = inputId, type = "text", value = value,
                     class="returnTextArea form-control"))
}

returnTextAreaInput2 <- function(inputId, label, value = "") {
  tagList(
    tags$label(label, `for` = inputId),br(),
    tags$textarea(id=inputId, type = "text", value = value, rows="3",
                  class="returnTextArea form-control")
  )
}

setwd("~/Desktop")

ui <- basicPage(
    includeScript("returnTextAreaBinding.js"),
    returnTextAreaInput1("ret1", "Select 1:", "init text 1"),
    returnTextAreaInput2("ret2","Select 2:", "init text 2"),
    textOutput("text_out1"),
    textOutput("text_out2")
)

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

  output$text_out1 <- renderPrint({
    input$ret1
  })

  output$text_out2 <- renderPrint({
    input$ret2
  })
}

shinyApp(ui = ui, server = server)

以下是绑定的js代码。

// based on https://gist.github.com/xiaodaigh/7150112
var returnTextAreaBinding = new Shiny.InputBinding();
$.extend(returnTextAreaBinding, {

    find: function(scope) {
        return $(scope).find('.returnTextArea');
    },
    getId: function(el) {
        return $(el).attr('id')
    },
    getValue: function(el) {
        return el.value;
    },
    setValue: function(el, value) {
        el.value = value;
    },
    subscribe: function(el, callback) {
        $(el).on('keyup.textInputBinding input.textInputBinding', function(event) {
            if(event.keyCode == 13) { //if enter key is pressed
                callback()
            }
        });
    },
    unsubscribe: function(el) {
        $(el).off('.textInputBinding');
    },
    receiveMessage: function(el, data) {
        if (data.hasOwnProperty('value'))
            this.setValue(el, data.value);
        if (data.hasOwnProperty('label'))
            $(el).parent().find('label[for=' + el.id + ']').text(data.label);
        $(el).trigger('change');
    },
    getState: function(el) {
        return {
            label: $(el).parent().find('label[for=' + el.id + ']').text(),
            value: el.value
        };
    },
    getRatePolicy: function() {
        return {
            policy: 'debounce',
            delay: 250
        };
    }
});
Shiny.inputBindings.register(returnTextAreaBinding, 'shiny.returnTextArea');

编辑:根据建议,此功能按预期工作

returnTextAreaInput <- function(inputId, label = "", value = "") {
  tagList(
    tags$label(label, `for` = inputId),br(),
    tags$textarea(id=inputId, type = "text", rows="2",
                  class="returnTextArea form-control", value)
  )
}

1 个答案:

答案 0 :(得分:1)

您可以添加value作为tags$textarea函数的第一个参数,它将作为默认值添加到html textarea标记之间:

returnTextAreaInput2 <- function(inputId, label, value = "") {
        tagList(
                tags$label(label, `for` = inputId),br(),
                tags$textarea(value,id=inputId, type = "text", value = value, rows="3",
                              class="returnTextArea form-control")
        )
}