スマート テーブルには、すべての列 (st-search) または 1 つの目的の列 (st-search="'firstName') を検索する機能が組み込まれています。複数の列 (すべてではない) 内で検索を行うことは可能ですか? 例: 次のようなテーブルがある場合: 名前、ニックネーム、住所などのデータ:
- ジョン、JJ、いくつかの住所
- スティーブ、ジョンも演説
- ジェーン、ジェーン、ジョン村
「John」を検索すると、最初の 2 列のみが結果として表示されます。出来ますか?
スマート テーブルには、すべての列 (st-search) または 1 つの目的の列 (st-search="'firstName') を検索する機能が組み込まれています。複数の列 (すべてではない) 内で検索を行うことは可能ですか? 例: 次のようなテーブルがある場合: 名前、ニックネーム、住所などのデータ:
「John」を検索すると、最初の 2 列のみが結果として表示されます。出来ますか?
同様の問題があり、この投稿のヒントを使用して解決しました。
スマートテーブルのドキュメントには次のように記載されています。
は
stSetFilter
、Smart Table を検索するときに使用されるフィルターを置き換えます。1 つのエントリが別のエントリのサブストリングである select のように、デフォルトの動作がstSearch
要求を満たさない場合は、カスタム フィルタを使用して目的を達成します。
と:
st-safe-src
コレクション内のすべての個別の要素を適切に表示するには、select が必要であることに注意してください。これを省略すると、select にはテーブルに表示されている要素の値のみが含まれ、ページングの影響も受けます。
HTML の table 要素内で独自のフィルターを宣言できます。
<table ... st-set-filter="myCustomFilter" class="table table-striped">
...そして、述語関数を使用して (アプリ内で) フィルターをカスタマイズできます。次のように動作します。
// filter method, creating `myCustomFilter` a globally
// available filter in our module
.filter('myCustomFilter', ['$filter', function($filter) {
// function that's invoked each time Angular runs $digest()
return function(input, predicate) {
searchValue = predicate['$'];
//console.log(searchValue);
var customPredicate = function(value, index, array) {
console.log(value);
// if filter has no value, return true for each element of the input array
if (typeof searchValue === 'undefined') {
return true;
}
var p0 = value['name'].toLowerCase().indexOf(searchValue.toLowerCase());
var p1 = value['nickname'].toLowerCase().indexOf(searchValue.toLowerCase());
if (p0 > -1 || p1 > -1) {
// return true to include the row in filtered resultset
return true;
} else {
// return false to exclude the row from filtered resultset
return false;
}
}
//console.log(customPredicate);
return $filter('filter')(input, customPredicate, false);
}
}])
フィルタの動作を確認するために、この小さなplnkrを作成しました
いいえ、回避策は、テーブルコントローラーを必要とする独自のディレクティブを作成し、その API を 2 回呼び出すことです (検索が追加されるため)。
directive('stSearch', ['$timeout', function ($timeout) {
return {
require: '^stTable',
scope: {
predicate: '=?stSearch'
},
link: function (scope, element, attr, ctrl) {
var tableCtrl = ctrl;
// view -> table state
element.bind('input', function (evt) {
evt = evt.originalEvent || evt;
tableCtrl.search(evt.target.value, 'column1');
tableCtrl.search(evt.target.value, 'column2');
});
}
};
}]);
詳細については、stSearch ディレクティブを参照してください。