2016-08-23 5 views
0

Я пытаюсь выполнить следующее решение: http://plnkr.co/edit/UbHxQNjV1G8kXsIY2GyF?p=previewAngular2 фильтр трубы

Но по какой-то причине он не работает. Моя реализация выглядит так:

фильтр трубы

import {Pipe, PipeTransform} from '@angular/core'; 

@Pipe({ 
    name: 'filter' 
}) 

export class FilterPipeService implements PipeTransform { 
transform(value: any, args: string[]): any { 
    let filter = args[0]; 

    if (filter && Array.isArray(value)) { 
     let filterKeys = Object.keys(filter); 
     return value.filter(item => 
      filterKeys.reduce((memo, keyName) => 
       memo && item[keyName] === filter[keyName], true)); 
    } else { 
     return value; 
    } 
    } 
} 

мои-support.component.ts

import { FilterPipeService } from '../../services/filter-pipe.service' 


@Component({ 
    selector: 'nmg-mysupport', 
    directives: [CORE_DIRECTIVES, 
      FORM_DIRECTIVES, 
      ..., 
template: require('./my-support.component.html'), 
styles: [require('./my-support.component.scss')], 
pipes: [FilterPipeService] 
}) 
export class MySupportComponent implements OnInit { 
public faqList; 
public listFilter; 

constructor() { 
this.faqList = [ 
    {'question' : 'First Question', 'answer': 'Answer to First Question'}, 
    {'question' : 'Second Question', 'answer': 'Answer to Second Question'}, 
    {'question' : 'Third Question', 'answer': 'Answer to Third Question'}, 
    {'question' : 'Fourth Question', 'answer': 'Answer to Fourth Question'}, 
] 
} 

} 

И этот HTML

<div class="col-sm-9 col-sm-offset-3 col-md-10 page-header col-md-offset-2"> 
<h1 class="headline">Support/Hilfe</h1> 
</div> 
<div class="contentWrapper col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> 
    <div class="content"> 
    <div class="input-group input-group-sm" style="margin-bottom: 10px;"> 
     <input value="" class="form-control" placeholder="Suche" autofocus #listFilter (keyup)="0"> 
     <div class="input-group-btn"> 
     <button type="submit" class="btn btn btn-default btn-flat"><i class="fa fa-search"></i></button> 
     </div> 
    </div><br><br> 
     <tabset> 
     <tab heading="Media Grid Hilfe"><br> 
     </tab> 
     <tab heading="Häufig gestellte Fragen"><br> 
     {{listFilter.value}} 
      <div *ngFor="let faqItem of faqList | filter:{question: listFilter.value}"> 
      <h3> {{ faqItem.question }}</h3> 
      <h4> {{ faqItem.answer }}</h4> 
      </div> 
     </tab> 
     <tab heading="Glossar"><br> 
     </tab> 
     </tabset><br> 
    </div> 

Если Я пытаюсь t o фильтровать, введя что-нибудь в нем, ничего не работает, и я не получаю никаких ошибок.

ответ

2

Я думаю, что вам нужно

@Pipe({ 
    name: 'filter', 
    pure: false 
}) 

иначе труба не будет вызываться при изменении содержимого массива, так как обнаружение Угловое изменение не проверяет массив или объект контента, только ссылки.

0

Я гость вам нужен фильтр, как в AngularJS

import { Pipe, PipeTransform } from '@angular/core'; 

@Pipe({ 
    name: 'filter' 
}) 
export class FilterPipe implements PipeTransform { 

    transform(items: Array<any>, conditions: {[field: string]: any}): Array<any> { 
    return items.filter(item => { 
     let allBlanks = true; 
     for (let field in conditions) { 
     let itemField = item[field] ? item[field].toLowerCase() : ''; 
     let conditionField = conditions[field] !== undefined ? conditions[field].toLowerCase() : ''; 
     if(conditionField !== '') {allBlanks = false;} 
     if (itemField.indexOf(conditionField) !== -1 && conditionField !== '') { 
      return true; 
     } 
     } 
     return allBlanks; 
    }); 
    } 
} 
Смежные вопросы