Knockout.js:使用多个按钮切换多个Dom元素的可见性

Hal*_*yon 3 html javascript jquery binding knockout.js

我有一个js小提琴(位于这里),我想模仿使用knockout.js.这个想法是每个按钮都有一个相应的div标签.如果相应的div标签可见,则在单击按钮时应隐藏.否则,它应该显示.如果任何其他非对应的div可见,则应隐藏然后显示相应的div.如何使用knockout模仿这个jQuery版本?淘汰版的js小提琴就在这里.它有效,但看起来仍然很冗长.似乎应该有一种方法可以使它更具活力并减少工作量.任何帮助是极大的赞赏.

<style type="text/css">
    .text { background-color: lightgray; }
</style>

<script type="text/javascript">
    $(document).ready(function () {
        var viewModel = {
            showHide1: ko.observable(false),
            showHide2: ko.observable(false),
            showHide3: ko.observable(false),
            toggle1: function () {
                this.showHide1(true);
                this.showHide2(false);
                this.showHide3(false);
            },
            toggle2: function () {
                this.showHide1(false);
                this.showHide2(true);
                this.showHide3(false);
            },
            toggle3: function () {
                this.showHide1(false);
                this.showHide2(false);
                this.showHide3(true);
            }
        };

        ko.applyBindings(viewModel);
    });
</script>

<div id="text1" class="text" data-bind="if: showHide1">Text 1</div>
<div id="text2" class="text" data-bind="if: showHide2">Text 2</div>
<div id="text3" class="text" data-bind="if: showHide3">Text 3</div>
<br />
<br />
<button id="button1" type="button" data-bind="click: toggle1">Button 1</button>
<button id="button2" type="button" data-bind="click: toggle2">Button 2</button>
<button id="button3" type="button" data-bind="click: toggle3">Button 3</button>
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 5

您可以将template绑定与动态模板名称一起使用,如:

<div class="text" data-bind="template: { 'if': current, name: current() }"></div>
<button type="button" data-bind="click: toggle1">Button 1</button>
<button type="button" data-bind="click: toggle2">Button 2</button>
<button type="button" data-bind="click: toggle3">Button 3</button>

<script id="text1" type="text/html">text 1</script>
<script id="text2" type="text/html">text 2</script>
<script id="text3" type="text/html">text 3</script>
Run Code Online (Sandbox Code Playgroud)

使用视图模型:

var viewModel = {
    current: ko.observable(''),

    toggle1: function () {
        this.current("text1");
    },
    toggle2: function () {
        this.current("text2");
    },
    toggle3: function () {
        this.current("text3");
    },
};

ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)

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

请注意,在KO 2.3,你不会有通过current()name选项,可以只通过current,因为它现在可以正确解开.