2017-01-09 15 views
0

これまで何度もフィルタリングを行いましたが、この特定のケースで問題があります。私はオブジェクトのリストをページネーションで設定していますが、使いやすさのためにそれらをフィルタリングできるようにしたいと考えています。オブジェクトの例は次のようになります。2つのオブジェクトフィールドのAngularJsフィルタ

{ 
    baseline:0.75 
    clonedFrom:Object 
    description:"Just a simple description.." 
    includeable:false 
    key:"bc889881-7979-4e04-b586-d53faab26b6b" 
    name:"Just a simple question?" 
    type:"BayesianModel" 
    version:1483477351992 
    versionComment:null 
    versionLabel:"0.11" 
} 

ほとんどの場合、オブジェクトの外観は恣意的です。私は同時にオブジェクトのnamedescriptionの両方をフィルタリングしようとしています。例えば、ユーザーがいずれかのキーワードを知っている場合、結果を絞り込むことができます。

私はフィルタと、以下に示す<ul>の内側結果についてinputを持っている:

<ul class="list-group"> 
    <li class="list-group-item"> 
    <div class="form-group has-feedback"> 
     <input type="text" 
      ng-model="vm.resultFilter" 
      ng-change="vm.updateFilter()" 
      class="form-control filterInput" 
      placeholder="Filter Results" /> 
     <span ng-if="vm.resultFilter" 
      ng-click="vm.resultFilter = ''; vm.updateFilter();" 
      class="fa fa-times fa-lg form-control-feedback"> 
     </span> 
    </div> 
    </li> 
    <li class="list-group-item link-row model-list" 
     ng-repeat="result in vm.filteredResults 
      | startFrom : ((vm.currentPage - 1) * vm.itemsPerPage) 
      | limitTo: vm.itemsPerPage" 
     ng-if="result.name != vm.model.name" 
     ng-click="vm.selected = result;" 
     ng-class="{selected: result === vm.selected}" 
     ng-init="displayNumber = vm.incrementDisplayIndex();"> 
    <h4 class="list-group-item-heading">{{result.description}} - {{result.name !== vm.model.name}}</h4> 
    <p class="list-group-item-text"> 
     {{result.name}} 
    </p> 
    </li> 
</ul> 

ので、フィルタの名前はvm.resultFilterで、フィルタが更新されるたびに呼び出されたcooresponding方法がありますupdateFilter()(これはページ区切りに必要です)。

function updateFilter() { 
    vm.filteredResults = $filter('filter')(vm.results, { 
    'name': vm.resultFilter, 
    'description': vm.resultFilter 
    }); 
    vm.totalItems = vm.filteredResults.length; 
    vm.noOfPages = Math.ceil(vm.filteredResults.length/vm.itemsPerPage); 
} 

フィルタリングを100%実行するのに問題があります。時には、それは説明フィールドでのみフィルタリングされているように見えますが、時には、1つの結果の説明フィールドにある単語を検索し、結果のないフィルタリングを行います(false)。任意のヒントをいただきました。

+0

の代わりにincludesを使用する必要があります。結果は、結果が名前と説明の両方に一致しなければならないことを意味します。 –

+0

私はあなたが意味するものを理解していますが、どこにでもAND演算子を使用していませんか?両方のフィールドを 'vm.resultFilter'に指定しない限り、何が起こっているのでしょうか?その場合、どうすればそれを 'OR'演算子にするのですか? – erp

+0

両方のフィールドをポイントすると、AND条件でフィルタが機能します。これは役に立つかもしれないhttp://stackoverflow.com/questions/15868248/how-to-filter-multiple-values-or-operation-in-angularjs –

答えて

1

あなたのHTMLにfilterが使用されていないので、Arrayプロトタイプのfilterプロパティを使用することをお勧めします。

function updateFilter() { 
    vm.filteredResults = vm.results.filter(function(item){ 
    return (item.name==vm.resultFilter || item.description==vm.resultFilter) 
    } 

    vm.totalItems = vm.filteredResults.length; 
    vm.noOfPages = Math.ceil(vm.filteredResults.length/vm.itemsPerPage); 
} 

文字列に指定した文字列の文字が含まれているかどうかを判断する必要がある場合。あなたは、あなたのフィルターはとAND演算子で動作を考慮してください==

vm.filteredResults = vm.results.filter(function(item){ 
    return (item.name.includes(vm.resultFilter) || item.description.includes(vm.resultFilter)) 
} 
+0

だから、もう一つは私が探しているものの多くです。あなたの頭の上から知っているなら、ちょっと好奇心の質問です。このケースではフィルタリングを大文字小文字を区別しないようにする方法を知っていますか?これは「文字列を含んでいるのですか」というのは、この場合は大文字と小文字が区別されます(わたしにとっては好ましくありません)。 – erp

+0

Stringプロパティの両方の文字列を小文字に変換します.toLowerCase() (vm.resultFilter.toLowerCase()) –

+0

これは明らかな解決策でした;)しかし、私は他のオプションがあるかどうかを見ているだけです。助けてくれてありがとうm8 – erp

関連する問題