javascript - 带 Bootstrap 和 knockout 的可折叠面板

标签 javascript twitter-bootstrap knockout.js

我无法使用 KnockoutJS 制作 Accordion ,而 Bootstrap 无法正常工作。我是这样定义的:

<div class="panel-group" id="accordion" data-bind="foreach: Advertisers()">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h4 class="panel-title">
                <span data-toggle="collapse" data-bind="html: $data, attr: { 'data-target': '#' + $data }"></span>
            </h4>
        </div>
    </div>
    <div class="panel-collapse collapse" data-parent="#accordion" data-bind="attr: { id: $data }">
        <div class="panel-body">
             ...content...

"Advertisers"是一个可观察的字符串数组,因此 $data 是一个字符串。我为每个广告商得到一个“行”。

所有行最初都是折叠的,单击一行展开下面的内容。到目前为止一切顺利。

问题是,当我单击另一行时,我希望之前展开的行会折叠,但这种情况并没有发生。 (我也无法使用 Bootstrap 和 KnockoutJS...)

编辑了代码。

最佳答案

简单的自定义绑定(bind)怎么样,它还可以让您稍微整理一下 View :

ko.bindingHandlers.bootstrapAccordion = {
  init: function(elem, value, allBindings) {
    var options = ko.utils.unwrapObservable(value()),
        handleClass = '[data-toggle]',
        contentClass = '.collapse',
        openItem = ko.utils.unwrapObservable(options.openItem) || false,
        itemClass = '.' + ko.utils.unwrapObservable(options.item) || '.accordion-group',
        items = $(elem).find(contentClass);

    // toggle: false required to hide items on load
    items.collapse({ parent: elem, toggle: false });
    if (openItem > -1) items.eq(openItem).collapse('show');

    // if the array is dynamic, the collapse should be re-initiated to work properly
    var list = allBindings.get('foreach');
    if (ko.isObservable(list)) {
      list.subscribe(function() { 
        $(elem).find(contentClass).collapse({ parent: elem, toggle: false });              
      });
    }

    $(elem).on('click', handleClass, function() {
        $(elem).find(contentClass).collapse('hide');
        $(this).closest(itemClass).find(contentClass).collapse('show');
    });
  }
};

此绑定(bind)采用 2 个参数(容器的类名,以及可选的加载时打开的项目),例如:bootstrapAccordion: {item: 'panel-group', openItem: 0},以及应该设置在具有 foreach 绑定(bind)的同一元素上。它假定可折叠部分有一个 collapse 类,并且切换它们的句柄有一个 data-toggle 属性。

在此处查看实际效果: http://jsfiddle.net/pkvn79h8/22/

关于javascript - 带 Bootstrap 和 knockout 的可折叠面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30893880/

相关文章:

javascript - 窗口关闭后执行操作

javascript - 所见即所得多输入(jQuery 插件)

jquery - 在 ajax post 中发送二进制数据

html - 强制从新行开始的 DIV 直接位于上方 DIV 的下方

html - Bootstrap 3 导航栏列表项与导航栏品牌重叠

knockout.js - 如何从 knockout 数据绑定(bind)中引用 typescript 的枚举值?

javascript - Knockout.js 跟踪选中的复选框

javascript - 需要带有 Webpack 的 Modernizr

javascript - jsPDF - 包含其他 pdf

JavaScript:替换数组中的字符串