将Shiny unbindAll和bindAll仅限于和HTML元素

Limit Shiny unbindAll and bindAll only to and HTML element

本文关键字:HTML 元素 bindAll Shiny unbindAll      更新时间:2023-10-23

在Shiny站点中,他们说在对DOM进行更改之前,也就是说,添加或删除输入和输出之前,您需要通过调用unbindAllbindAll:来告诉Shiny

function modifyDom()
{          
    Shiny.unbindAll()
    insertInputsAndOutputs()
    removeOtherInputsAndOutputs()    
    Shiny.bindAll()
}

问题是,我的web应用程序有两个部分:侧边栏上的选择和根据用户选择显示信息的主容器。问题是:

  1. 假设用户已经选择了项目1,因此结构1显示在容器上
  2. 当用户选择项目2时,结构1在调用modifyDom时被删除,并且最后一行Shiny.bindAll()导致即使是侧边栏的选择也要重新初始化,因此它选择项目1并且结构1再次显示

因此,我的问题是:在Shiny中,是否有一种方法不解除所有对象的绑定,而只解除某个HTML元素中存在的对象的绑定。

我以前从未使用过Shiny,但根据这个链接并在其Github repo上搜索,unbindallbindall函数也可以通过以下方式使用:

unbindall(element)

bindall(element)

其中element似乎是DOM元素(从document.getElementById函数或jQuery等效$('#element')[0]返回的值)。

所以你可以写另一个这样的函数:

function modifyDomByElement (element) {
  Shiny.unbindAll(element);
  insertInputsAndOutputs();
  removeOtherInputsAndOutputs();
  Shiny.bindAll(element);
}

并保持modifyDom的功能在您发布时工作(不要忘记单一责任原则)。