【问题标题】:Using bootstrap dropdowns in SlickGrid column在 SlickGrid 列中使用引导下拉菜单
【发布时间】:2014-03-12 13:28:13
【问题描述】:

在使用 Boostrap (3.0) 和 SlickGrid 的应用程序中,我正在尝试将引导程序下拉列表添加到列中。

var columns = [                    
    {id:"rowNumber", name:"", field: "", editor:Slick.Editors.Text, formatter:RowNumberFormatter, behavior:"select", cssClass:"cell-selection", width:40, cannotTriggerInsert:true, resizable:false, unselectable:true, sortable:false},
    {id:"A", name:"X", field: "A", editor:Slick.Editors.Text, sortable:false, width:120},
    {id:"B", name:"Y", field: "B", readonly:true, width:120,
        formatter: linkFormatter = function (row, cell, value, columnDef, dataContext) {
             var a = 
                '<div class="dropdown">' +
                '  <a class="dropdown-toggle" data-toggle="dropdown" href="#">Action</a>' +
                '  <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">' +
                '      <li><a href="#">Item 1</a></li>' +
                '      <li><a href="#">Item 2</a></li>' +
                '      <li><a href="#">Item 3</a></li>' +
                '      <li><a href="#">Item 4</a></li>' +
                '  </ul>' +
                '</div>    ';
             return a;
        }
    }
];

但是它不起作用。我的猜测是,应该在格式化程序生成 HTML 之后应用 boostrap 绑定(魔术)。我该怎么做?

这里是一个 jsFiddle 版本:http://jsfiddle.net/kilativ/tEU37/

【问题讨论】:

  • 我认为你需要使用 Bootstrap 下拉菜单的 javascript 部分,你设置了它的样式,但我相信它永远不会打开,除非你运行 javascript $('.dropdown-toggle').dropdown() 并且你可能不能把它放在里面虽然你可以在编辑器中使用格式化程序
  • 尝试在格式化程序之外调用$('.dropdown-toggle').dropdown(),但没有成功
  • 我还尝试使用 asynPostRender 来动态操作单元格的 DOM,以便我可以应用 html() 或 append() 方法。还是没有运气
  • 您是否尝试过按照我的建议创建编辑器?这样做的时间稍长,但它为您提供了更多的灵活性..您可能还会遇到 SlickGrid 样式覆盖任何 Bootstrap 样式的问题,如果是这种情况,您必须找出哪个被覆盖并尝试补偿
  • 这需要用户点击两次,不是吗?一次进入编辑模式,另一次点击链接。

标签: twitter-bootstrap slickgrid


【解决方案1】:

您的实际问题不是您想象的那样...下拉菜单确实有效,但只是没有显示在前面...并且尝试更改 z-index 似乎没有帮助。现在我找到了部分解决方案,修复它还不够,但足以看到问题。
添加这段 CSS:

.dropdown {
    position: fixed;
}

您会看到您的菜单正在显示,但与网格的其余部分混合在一起,我尝试将所有类型的 z-index 放入其中,但无法使其完全正常工作。我将不得不挖掘更多,但现在这是一个开始......

解决方案
所以我花了更多时间在这方面,赏金帮助嘿嘿,并为您的问题找到了解决方案。首先,您不能直接在格式化程序中执行此操作,因为单元格不能变大,z-index 对此无济于事,因为您受限于单元格大小。相反,您要做的是创建一个外部&lt;div&gt;,将其附加到主体并使用单元格 X/Y 值重新定位它,然后还要确保新的&lt;div&gt; 作为z-index 足够高以启用网格顶部......很好,但现在的问题是你如何触发动作?只需为此事件onActiveCellChanged() 订阅一个函数即可。以您为例,我将您的代码从格式化程序移至新函数,因此我添加了这段代码:

grid.onActiveCellChanged.subscribe(function(e,args){
    $('#myDrop').remove(); // make sure to remove previous dropdown, you don't want to have 100 after a 100 clicks...
    if(args.cell != 2) {
        return;
    }
    var cellPos = args.grid.getActiveCellPosition();
    var elm = $('<div id="myDrop" class="dropdown" style="position:absolute; z-index:10000;">' +
        '  <a class="dropdown-toggle" data-toggle="dropdown" href="#">Action</a>' +
        '  <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">' +
        '      <li><a href="#">Item 1</a></li>' +
        '      <li><a href="#">Item 2</a></li>' +
        '      <li><a href="#">Item 3</a></li>' +
        '      <li><a href="#">Item 4</a></li>' +
        '  </ul>' +
        '</div>    ');
    $('body').append(elm);
    elm.css('top', cellPos.top + 5);
    elm.css('left', cellPos.left + 5);
    $('#myDrop.dropdown-toggle').dropdown('toggle');
    setTimeout(function () {
        $('#myDrop').addClass('open'); // make sure to open the dropdown, delayed so it really open after it's fully created
    }, 50);

});

我本来打算删除你的格式化程序,但由于你有一些随机整数值,所以我用这段代码替换了:

formatter: linkFormatter = function (row, cell, value, columnDef, dataContext) {
    return 'Action';
}

我不确定我所做的jsFiddle 的编辑是否只是暂时的,但无论如何这里是链接:jsFiddle
另请注意,您也可以致电unsubscribe(fn),但我认为没有必要,因为没有它,下拉菜单似乎消失了。你可以在这里找到可用的 SlickGrid 事件列表wiki/Grid-Events

【讨论】:

  • 看起来很棒...在 chrome 中...原来我的原始代码也无法在 IE 中呈现,这是一个不同的问题...但是您解决了我的问题,谢谢!
猜你喜欢
  • 2012-07-05
  • 2015-08-08
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多