Foreach:切换每个图标 - KnockoutJS

时间:2016-12-20 13:02:59

标签: javascript jquery knockout.js

我试图将加号转换为减号,一旦该部分被点击并展开后立即切换。按照我试过的代码。

<div>
    <ul style="list-style: none">
        <li data-bind="foreach: model">
            <div id="panelHeading">
                <a href="#" data-bind="click: $parent.toggleShow"><i class="fa fa-plus" style="padding-right: 5px;">+</i></a>
                <span data-bind="text: Main"></span>
            </div>
            <div id="panelContent" data-bind="if: show">
                <ul id="clustersList" data-bind="foreach: Sub" style="list-style: none">
                    <li><span style="padding-left: 20px;" data-bind="text: $data"></span></li>
                </ul>
            </div>
        </li>
    </ul>
</div>
=== JS ====
    var viewModel = function() {
      var self = this;
      self.model = ko.observableArray([{
        Main: "Main1",
        Sub: ["hello", "hi"],
        show: ko.observable(false)
      }, {
        Main: "Main2",
        Sub: ["one", "two"],
        show: ko.observable(false)
      }]);
      self.toggleShow = function (item) {
      $('this a').find('i').toggleClass('fa fa-plus fa fa-minus');
        var index = self.model.indexOf(item);
        if (item.show())
            self.model()[index].show(false);
        else
            self.model()[index].show(true);
        }
    }

    ko.applyBindings(new viewModel());

请查看我的小提琴here

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:4)

只需更改HTML即可根据show的当前值应用正确的样式:

<i class="fa" data-bind="css: { 'fa-plus': !show(), 'fa-minus': show() }"></i>

在你的JS中:

self.toggleShow = function (item) {
    item.show(!item.show());
};

请参阅Fiddle