通过模块中的renderUI创建的自动调整大小的textAreaInput

问题描述 投票:0回答:1

我正在尝试从模块调用的textAreaInput中获取我的renderUI-调整大小,以便默认情况下显示整个区域的内容。在Auto-resize textAreaInput created through renderUI的基础上,textAreaInput内的renderUI现在会根据需要自动调整大小,但是当我将renderUI放入模块时不会调整大小。

在两种情况下都使用:

jc <- "document.addEventListener('DOMContentLoaded', function(event) {
  var observe;
  if (window.attachEvent) {
    observe = function (element, event, handler) {
      element.attachEvent('on'+event, handler);
    };
  } else {
    observe = function (element, event, handler) {
      element.addEventListener(event, handler, false);
    };
  }
  function init () {
    var text = document.getElementById('text');
    function resize () {
      text.style.height = 'auto';
      text.style.height = text.scrollHeight+'px';
    }
    /* 0-timeout to get the already changed text */
    function delayedResize () {
      window.setTimeout(resize, 0);
    }
    observe(text, 'change',  resize);
    observe(text, 'cut',     delayedResize);
    observe(text, 'paste',   delayedResize);
    observe(text, 'drop',    delayedResize);
    observe(text, 'keydown', delayedResize);

    text.focus();
    text.select();
    resize();
  };
  setTimeout(function(){init();}, 500);
})
"

Works(自动调整大小):

ui <- shiny::fluidPage(
  shiny::tags$script(jc),
  shiny::uiOutput("tai")
)

server <- function(input, output, session) {
  output$tai <- shiny::renderUI({
    shiny::textAreaInput(inputId = "text", label = "a", value = "b")
  })
}

shiny::shinyApp(ui, server)

不起作用:

taiUI <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("tai"))
}

tai <- function(input, output, session) {
  ns <- session$ns
  output$tai <- shiny::renderUI({ 
    shiny::textAreaInput(inputId = ns("text"), label = "a", value = "b") 
  })
}

ui <- shiny::fluidPage(
  shiny::tags$script(jc),
  taiUI("taimodule")
)

server <- function(input, output, session) {
  shiny::callModule(tai, "taimodule")
}

shiny::shinyApp(ui, server)
javascript r shiny
1个回答
0
投票

这是因为ID是ns("text"),而不是"text"。因此,您必须替换此行:

var text = document.getElementById('text');

with

var text = document.getElementById('taimodule-text');
© www.soinside.com 2019 - 2024. All rights reserved.