Knockout.js显示/隐藏块可见性模式

Aki*_*lov 7 javascript design-patterns dry knockout.js

我在下一种情况下有代码重复问题.在我的页面上,我需要通过点击链接显示/隐藏很多块:

<div>
    <a data-bind="click: showHiddenFirst, visible: isVisibleFirst"href="#">Show first</a>
    <div data-bind="visible: !isVisibleFirst()" style="display:none">
        hidden content first
    </div>
</div>
<div>
    <a data-bind="click: showHiddenSecond, visible: isVisibleSecond"href="#">Show second</a>
    <div data-bind="visible: !isVisibleSecond()" style="display:none">
        hidden content second
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

而我的JS

var vm = function(){
    this.isVisibleFirst = ko.observable(true);

    this.showHiddenFirst = function(){
        this.isVisibleFirst(false)
    };

    this.isVisibleSecond = ko.observable(true);

    this.showHiddenSecond = function(){
        this.isVisibleSecond(false)
    };
};

ko.applyBindings(new vm());
Run Code Online (Sandbox Code Playgroud)

这是jsfiddle示例http://jsfiddle.net/sstude/brCT9/2/

问题如何避免所有这些显示/可见重复?也许我需要一些自定义绑定,我把我的隐藏块或smth的id.其他?您可以建议的任何模式?

RP *_*yer 4

以下是针对您的特定场景将此功能完全封装在可观察对象中的想法:

ko.bindingHandlers.clickVisible = {
    init: function(element) {
       var visible = ko.observable(true),
           opposite = ko.computed(function() { return !visible(); }),
           clickHandler = visible.bind(null, false);

        //apply bindings to anchor
        ko.applyBindingsToNode(element, { click: clickHandler, visible: visible });

        var sibling = element.nextSibling;
        //find the div (as text nodes, etc. will show up in nextSibling)
        while (sibling && sibling.nodeType != 1) {
            sibling = sibling.nextSibling;   
        }        

        //apply bindings to div
        if (sibling) {
            ko.applyBindingsToNode(sibling, { visible: opposite });
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

如果传递到绑定的值可能很重要,则可以根据需要进一步调整。

示例: http: //jsfiddle.net/rniemeyer/gCgy5/