闪亮的 navbarMenu 内的 navbarMenu
navbarMenu within navbarMenu in Shiny
如果我在 Shiny 中使用以下 UI 我大致得到我想要的输出但它实际上并没有工作,因为最低级别的 navbarMenu 显示它的顶级标签和指示它可扩展的箭头但是子项注册失败。我的猜测是因为它仅设计为顶级元素 (navbarMenu)。我的问题是,是否有另一个元素可以执行所需的子菜单任务?无法在菜单项下分组会很快变得视觉效率低下。
shinyUI(navbarPage("My Application",
tabPanel("Component 1"),
tabPanel("Component 2"),
navbarMenu("More",
tabPanel("Sub-Component A"),
tabPanel("Sub-Component B"),
navbarMenu("Yet More",
tabPanel("Subpart 1"),
tabPanel("Subpart 2"))
)
)
)
问得好!
我认为没有其他元素可以使用,但您可以使用 JavaScript 使其发挥作用。
我对 app.R
所做的唯一更改是包含 js 文件,使用:
includeScript("script.js")
。真正的部分是脚本本身:我们定义了 2 个事件处理程序:
单击下拉菜单
下拉菜单由 navbarMenu
创建。它们没有 tabPane
连接,因此我们需要的是通过切换下拉菜单(关闭时打开,或处于打开状态时关闭)来重新定义默认行为。
单击选项卡
单击选项卡时需要考虑 3 个子任务:
在选项卡内容中设置活动元素
我们需要显示被点击的相应 tabPane
,以便查看内容。显示带有 class: active
的 tabPane
,因此首先从每个 tabPane
中删除 active
class,然后添加 active
class 用于单击的选项卡。
在导航栏中设置活动元素
同样的情况,active
选项卡在视觉上显示为 navbar
颜色较深的灰色。
关闭所有下拉菜单
单击 navbarMenu
中的特定选项卡后,最好关闭所有下拉菜单,否则它们将保持打开状态。
script.js
$(document).ready(function(){
$('.dropdown').on('click', function(e){
$(this).toggleClass('open');
e.stopPropagation();
e.preventDefault();
});
$('[data-toggle=tab]').on('click', function(e){
let dv = ($(this).attr('data-value'));
//Set active element in tabcontents
$('.tab-pane').removeClass('active');
$('.tab-pane[data-value="' + dv + '"]').addClass('active');
//Set active element in navbar
$('a[data-toggle=tab]').parent().removeClass('active');
$('a[data-value="' + dv + '"]').parent().addClass("active");
//Close the dropdowns
$('.dropdown').removeClass('open');
e.stopPropagation();
e.preventDefault();
});
});
您可以使用 runGist("https://gist.github.com/dgyurko/e1952c5ecbf9a1315b41b8d7ef1f7a8f")
快速试用
确保在浏览器中进行测试,因为它在 RStudio Viewer 中似乎无法正常工作!
演示
如果我在 Shiny 中使用以下 UI 我大致得到我想要的输出但它实际上并没有工作,因为最低级别的 navbarMenu 显示它的顶级标签和指示它可扩展的箭头但是子项注册失败。我的猜测是因为它仅设计为顶级元素 (navbarMenu)。我的问题是,是否有另一个元素可以执行所需的子菜单任务?无法在菜单项下分组会很快变得视觉效率低下。
shinyUI(navbarPage("My Application",
tabPanel("Component 1"),
tabPanel("Component 2"),
navbarMenu("More",
tabPanel("Sub-Component A"),
tabPanel("Sub-Component B"),
navbarMenu("Yet More",
tabPanel("Subpart 1"),
tabPanel("Subpart 2"))
)
)
)
问得好!
我认为没有其他元素可以使用,但您可以使用 JavaScript 使其发挥作用。
我对 app.R
所做的唯一更改是包含 js 文件,使用:
includeScript("script.js")
。真正的部分是脚本本身:我们定义了 2 个事件处理程序:
单击下拉菜单
下拉菜单由 navbarMenu
创建。它们没有 tabPane
连接,因此我们需要的是通过切换下拉菜单(关闭时打开,或处于打开状态时关闭)来重新定义默认行为。
单击选项卡
单击选项卡时需要考虑 3 个子任务:
在选项卡内容中设置活动元素
我们需要显示被点击的相应 tabPane
,以便查看内容。显示带有 class: active
的 tabPane
,因此首先从每个 tabPane
中删除 active
class,然后添加 active
class 用于单击的选项卡。
在导航栏中设置活动元素
同样的情况,active
选项卡在视觉上显示为 navbar
颜色较深的灰色。
关闭所有下拉菜单
单击 navbarMenu
中的特定选项卡后,最好关闭所有下拉菜单,否则它们将保持打开状态。
script.js
$(document).ready(function(){
$('.dropdown').on('click', function(e){
$(this).toggleClass('open');
e.stopPropagation();
e.preventDefault();
});
$('[data-toggle=tab]').on('click', function(e){
let dv = ($(this).attr('data-value'));
//Set active element in tabcontents
$('.tab-pane').removeClass('active');
$('.tab-pane[data-value="' + dv + '"]').addClass('active');
//Set active element in navbar
$('a[data-toggle=tab]').parent().removeClass('active');
$('a[data-value="' + dv + '"]').parent().addClass("active");
//Close the dropdowns
$('.dropdown').removeClass('open');
e.stopPropagation();
e.preventDefault();
});
});
您可以使用 runGist("https://gist.github.com/dgyurko/e1952c5ecbf9a1315b41b8d7ef1f7a8f")
确保在浏览器中进行测试,因为它在 RStudio Viewer 中似乎无法正常工作!