この質問で参照するフィドルは次のとおりです:http://jsfiddle.net/CJRDQ/3/
私は次のような単純なカスタムエキスパンダーを作成しました:
<div class="ui-expander">
<h3 class="ui-expander-head">...</h3>
<div class="ui-expander-content">...</div>
</div>
エクスパンダの機能は、カスタムKnockout.jsバインディングと一部のjQueryを介して組み込まれています(カスタムバインディングの使用は、バインディングによって作成された問題に対処するためのものですwith
)。
ko.bindingHandlers.expand = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if ($(element).hasClass('ui-expander')) {
var expander = element;
var head = $(expander).find('.ui-expander-head');
var content = $(expander).find('.ui-expander-content');
$(head).click(function () {
$(head).toggleClass('ui-expander-head-collapsed')
$(content).toggle();
});
}
}
};
エキスパンダーヘッドにクリック可能なコントロールがない限り、これは期待どおりに機能します。現在のシナリオでは、ビューモデルで結果をフィルタリングするために、エキスパンダーヘッドにチェックボックスを提供する必要があります。
<div class="ui-expander" data-bind="expand: true">
<h3 class="ui-expander-head">
<span class="ui-expander-toggle">[-]</span> Expander Title
<input id="cbx" type="checkbox" data-bind="checked: showAll" /> <label for="cbx">Show All</label>
</h3>
<div class="ui-expander-content">
Expander Content
</div>
</div>
ラベルをクリックすると、展開/折りたたみ動作がトリガーされず、対応するチェックボックスがオン/オフになります(望ましい)。ただし、チェックボックスを直接クリックすると、展開/折りたたみがトリガーされ、対応するチェックボックスがオン/オフ(不要)になります。
展開/折りたたみをトリガーせずにチェックボックスやラベルをクリックできるようにする必要がありますが、エキスパンダーヘッドの他の部分がクリックされた場合は、展開/折りたたみを維持します。これらの要件を満たすために何をする必要がありますか?
繰り返しになりますが、参考のためにフィドルを提供しました:http: //jsfiddle.net/CJRDQ/3/