ソレファルド、これを行うためのより良い方法は間違いなくあります.
まず、独自の「フィルター」オブジェクトの配列をビュー モデルに追加し、ko.computed を追加して、フィルター処理されたデータを提供します。フィルター ボタンを「フィルター」オブジェクトの配列にバインドします。このようなもの:
var viewModel = function(){
var self = this;
self.filters = [
{buttonText:'Button Text', filterKey:'filterKeyOne'},
{buttonText:'Other Button Text', filterKey:'filterKeyTwo'}
];
self.selectedFilterKey = ko.observable('none');
self.setFilter = function(){...}
self.data = ko.observableArray([...]);
self.filteredData = ko.computed(function(){...});
}
次のようにバインドします。
<div data-bind="foreach: filters">
<button data-bind="click : $parent.setFilter, text: buttonText"></button>
</div>
<div data-bind="foreach: filteredData">
...
</div>
Knockout にフィルター ボタンのクリック バインディングを行わせることで、"runFilter" 関数の最初のパラメーターとしてフィルター オブジェクト全体を取得できます。次に、フィルター ボタンのクリック ハンドラー (この例では "setFilter") を次のように実装できます。
self.setFilter = function(filterItem){
self.selectedFilterKey(filterItem.filterKey);
};
"selectedFilterKey" をオブザーバブルにすることで、filteredData を ko.computed として実装できます。これは、次のように、"selectedFilterKey" が変更されたときに ui を自動的に更新します。
...
self.filteredData = ko.computed(function(){
//pick the right filter function
var filterFunction = filterOne;//assign the default filter function
switch(self.selectedFilterKey()){
case 'filterKeyOne':
filterFunction = self.filterOne;//your first filter
break;
case 'filterKeyTwo':
filterFunction = self.filterTwo;//your second filter
break;
}
return ko.utils.arrayFilter(self.data(), function(item){
//return true if item passes filter
return filterFunction(item);
});
});
...
機能的アプローチ
より関数的なプログラミング アプローチを使用する場合は、フィルター オブジェクトでフィルター関数を定義してみてください。
self.filters = [
{buttonText:'Button Text', filterFunction:function(item){...}},
{buttonText:'Other Button Text', filterFunction:function(item){...}}
];
キーではなく、選択した機能を保存します
self.setFilter = function(filterItem){
self.selectedFilterFunction(filterItem.filterFunction);
};
switchステートメントをスキップします
...
self.filteredData = ko.computed(function(){
return ko.utils.arrayFilter(self.data(), function(item){
//return true if item passes filter
return self.selectedFilterFunction()(item);
});
});
...
詳しくは
この並べ替えの方法について詳しく知りたい場合は、こちらのブログで読むことができます: http://ryanrahlf.com/sorting-tables-by-column-header-with-knockout-js/
これが役立つことを願っています!