javascript - 使用 knockoutjs + twitter bootstrap 跟踪标签

标签 javascript html twitter-bootstrap knockout.js

我试图在 View 模型中跟踪选定的选项卡,但我似乎无法让它工作。

在以下代码中,当您单击选项卡时,标题将正确更新,但不会显示选项卡的内容。如果您删除 ,请单击:$parent.selectSection 然后显示内容,但标题不会更新。

现在,如果您从 li 中删除 data-bind="css: { active: selected }" 那么当您单击选项卡时它似乎可以工作,但是选择第二个选项卡的按钮没有。

我怎样才能让它工作?

参见:http://jsfiddle.net/5PgE2/3/

HTML:

<h3>
    <span>Selected: </span>
    <span data-bind="text: selectedSection().name" />
</h3>
<div class="tabbable">
    <ul class="nav nav-tabs" data-bind="foreach: sections">
        <li data-bind="css: { active: selected }">
            <a data-bind="attr: { href: '#tab' + name }
, click: $parent.selectSection" data-toggle="tab">
                <span data-bind="text: name" />
            </a>
        </li>
    </ul>
    <div class="tab-content" data-bind="foreach: sections">
        <div class="tab-pane" data-bind="attr: { id: 'tab' + name }">
            <span data-bind="text: 'In section: ' + name" />
        </div>
    </div>
</div>
<button data-bind="click: selectTwo">Select tab Two</button>

JS:

var Section = function (name) {
    this.name = name;
    this.selected = ko.observable(false);
}

var ViewModel = function () {
    var self = this;
    self.sections = ko.observableArray([new Section('One'),
    new Section('Two'),
    new Section('Three')]);
    self.selectedSection = ko.observable(new Section(''));
    self.selectSection = function (s) {
        self.selectedSection().selected(false);

        self.selectedSection(s);
        self.selectedSection().selected(true);
    }

    self.selectTwo = function() { self.selectSection(self.sections()[1]); }
}

ko.applyBindings(new ViewModel());

最佳答案

有几种方法可以处理这个问题,要么使用 Bootstrap 的 JS,要么让 Knockout 添加/删除 active 类。

要仅使用 Knockout 来做到这一点,这里有一个解决方案,其中 Section 本身有一个计算来确定它当前是否被选中。

var Section = function (name, selected) {
    this.name = name;
    this.isSelected = ko.computed(function() {
       return this === selected();  
    }, this);
}

var ViewModel = function () {
    var self = this;

    self.selectedSection = ko.observable();

    self.sections = ko.observableArray([
        new Section('One', self.selectedSection),
        new Section('Two', self.selectedSection),
        new Section('Three', self.selectedSection)
    ]);

    //inialize to the first section
    self.selectedSection(self.sections()[0]);
}

ko.applyBindings(new ViewModel());

标记看起来像:

<div class="tabbable">
    <ul class="nav nav-tabs" data-bind="foreach: sections">
        <li data-bind="css: { active: isSelected }">
            <a href="#" data-bind="click: $parent.selectedSection">
                <span data-bind="text: name" />
            </a>
        </li>
    </ul>
    <div class="tab-content" data-bind="foreach: sections">
        <div class="tab-pane" data-bind="css: { active: isSelected }">
            <span data-bind="text: 'In section: ' + name" />
        </div>
    </div>
</div>

此处示例:http://jsfiddle.net/rniemeyer/cGMTV/

您可以使用多种变体,但我认为这是一种简单的方法。

这是一个调整,其中事件选项卡使用部分名称作为模板:http://jsfiddle.net/rniemeyer/wbtvM/

关于javascript - 使用 knockoutjs + twitter bootstrap 跟踪标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501207/

相关文章:

javascript - Angularjs 无法识别 {{}}

javascript - 编写此代码的更简洁方法

javascript - 如何为选择选项制作占位符但它具有循环值?

html - 将 .PSD 转换为 html/css 的过程

javascript - 在javascript中有效地分割贝塞尔曲线

python - django模板嵌套字典,按键获取值

html - 用文本链接替换图像按钮

html - 定位视频

html - 当我通过 CSS 调整大小时,为什么我的图像会缩小太多?

jquery - Bootstrap 4 |将 <ul> 右对齐