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.其他?您可以建议的任何模式?
以下是针对您的特定场景将此功能完全封装在可观察对象中的想法:
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/