2017-01-09 64 views
0

我已经完成了多次过滤,但在此特定情况下遇到问题。我有分页设置的对象列表,但我也希望能够过滤它们以便于使用。一个例子对象可能看起来像:两个对象字段上的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。例如,如果用户知道关键词,他们可以缩小结果。

我有input的过滤器和下面所示的<ul>内的结果:

<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%的烦恼。有时它看起来只是在描述字段上进行过滤,但有时我会搜索只有一个结果的描述字段中的一个字,并且它将过滤而没有结果(这将是错误的)。任何提示赞赏。

+0

要考虑到你的过滤器可以用于和AND运算符。这意味着,结果必须符合条件名称和描述才能成为结果。 –

+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); 
} 

如果您需要确定一个字符串是否包含指定字符串的字符。您可能需要使用includes,而不是==

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

太好了。所以第二个更多的是我正在寻找的东西。只是一个奇怪的问题,如果你知道你的头脑:你知道如何使这种情况下的过滤不区分大小写? Angular默认是,虽然在这种情况下,因为它'是否包含字符串'显然它会区分大小写(对我而言是不合需要的) – erp

+0

将字符串转换为小写字符串属性.toLowerCase() item.name.toLowerCase()。includes(vm.resultFilter.toLowerCase()) –

+0

好吧,很酷,是的,这是显而易见的解决方案;)但只是看看我是否有其他选择。感谢今天m8 – erp