Angular2 автозаполнение фильтра * ng для данных

Я изучаю угловые 2 трубы и сталкиваюсь с проблемой. У меня есть поле автозаполнения, которое после выбора ввода должно отфильтровывать данные из моего * ngFor, который отображает список карточек. Прямо сейчас, когда вы начинаете печатать, автозаполнение работает, но когда выбрана фактическая категория, список карточек в ngFor не фильтруется. Что мне не хватает?

Спасибо

Итак, вот мое автозаполнение:

<form class="example-form">
  <md-form-field class="example-full-width">
  <input type="text" placeholder="Select a sport" aria-label="Number" mdInput 
     [formControl]="myControl" [mdAutocomplete]="auto">
    <md-autocomplete #auto="mdAutocomplete">
    <md-option *ngFor="let option of filteredOptions | matchesSport:option | 
     async" [value]="option">
      {{ option }}
    </md-option>
  </md-autocomplete>
</md-form-field>
</form>

Вот мой * ng для отображения списка md-карт:

  <md-list>      
  <md-list-item *ngFor="let g of games; let i = index | matchesSport:option" (click)="onSelect(g)" [class.active]="i == selectedRow">
    <md-card tabindex="-1">
      <md-card-content>
        <p md-line> {{g.Sport}}<span><i class="material-icons">accessibility</i></span> </p>
      </md-card-content>
      <md-card-actions>
        <button md-button md-raised-button>LIKE</button>
        <button md-button md-raised-button>SHARE</button>
      </md-card-actions>
    </md-card>
  </md-list-item>
</md-list>

А вот и моя трубка

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

@Pipe({
    name:'matchesSport'
})

 export class MatchesSportPipe implements PipeTransform {
    transform(items: any, category: string): Array<any> {            
    return items.filter(item => item.Sport === category);
  }
 }

А вот и мой контроллер:

import { Component, OnInit } from '@angular/core'; 
import { Game } from './models/game.model';
import { GameService } from './services/game-service';
import { FormControl } from '@angular/forms';
import { Observable } from 'rxjs/Observable';     
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/map';

export class AppComponent implements OnInit {
  title = 'app';
  games: any[] = [ ];
  statusMessage: string = "Loading games...";
  selectedRow: Object;
  setClickedRow: Function;
  selectedGame: Game;
  myControl: FormControl = new FormControl();

  options = [
   'Football',
   'Basketball',
   'Baseball',
   'Lacrosse',
   'Volleyball'
  ];

   filteredOptions: Observable<string[]>;

   constructor(private _gameService: GameService) {
     this.filteredOptions = this.myControl.valueChanges
     .startWith(null)
     .map(val => val ? this.filter(val) : this.options.slice());
    }
   filter(val: string): string[] {
     return this.options.filter(option =>
     option.toLowerCase().indexOf(val.toLowerCase()) === 0);
   }

   onSelect(game: Game): void {
     this.selectedGame = game;
    }


   ngOnInit() {
        return this._gameService.getGames()
       .subscribe((gameData) => this.games = gameData,
       (error) => {
       this.statusMessage = " something broke"
     });

   }
 }

person Troy Bryant    schedule 05.10.2017    source источник
comment
Смотрите ответ, я обновился с помощью рабочей скрипки.   -  person Fetrarij    schedule 06.10.2017


Ответы (1)


Во-первых, индекс должен быть после вертикальной черты:

<md-list-item *ngFor="let g of games | matchesSport:option; let i = index ">
  ...
</md-list-item>

И вы используете option, который не определен в канале. Вам нужно получить значение, выбранное из автозаполнения, и поместить его в качестве аргумента канала (здесь option):

Вы можете использовать событие: optionSelected в mat-autocomplete

<mat-autocomplete #auto="matAutocomplete" (optionSelected)="optionSelected($event)" name="myname">
  <mat-option *ngFor="let option of options" [value]="option">
...
  </mat-option>
</mat-autocomplete>

и в компоненте:

option: string; // <-- use it now
// ...
optionSelected(e) {
  this.option = e.option.value;
}

Тогда за ошибку:

ошибка: ERROR TypeError: Не удается прочитать свойство 'filter' неопределенного в MatchesSportPipe.webpackJsonp ... / .. / .. / .. / .. / src / app / customP‌ ipe.ts.MatchesSportP‌ ipe.transform ( customPipe.ts: 9)

Теперь вам нужно проверить в своей трубе, если элементы не определены, если категория не определена, прежде чем фильтровать элементы.

export class MatchesSportPipe implements PipeTransform {
    transform(items: any[], category: string): Array<any> {  
    if (!items) return [];  
    if (!category) return items;        
    return items.filter(item => item.Sport === category);
  }

Все поведение возобновилось в работающем плункере: https://embed.plnkr.co/4NDIy84YFW7OZkVPJZo5/

person Fetrarij    schedule 05.10.2017
comment
ошибка: ERROR TypeError: Невозможно прочитать свойство 'filter' неопределенного в MatchesSportPipe.webpackJsonp ... / .. / .. / .. / .. / src / app / customPipe.ts.MatchesSportPipe.transform (customPipe.ts: 9) - person Troy Bryant; 05.10.2017
comment
поэтому я сделал следующее: класс экспорта MatchesSportPipe реализует PipeTransform {transform (items: any [], category: string): Array ‹any› {return items.filter (item = ›item.Sport === category); }} и та же ошибка - person Troy Bryant; 05.10.2017
comment
@TroyBryant, или вы можете проверить канал также, чтобы он работал, только если данные определены. - person Fetrarij; 05.10.2017
comment
добавил мой контроллер. Произведена регулировка трубы и все та же ошибка - person Troy Bryant; 05.10.2017
comment
@TroyBryant см. Мой ответ, проверка в трубе для предметов не определена - person Fetrarij; 05.10.2017
comment
элемент определен проблема - категория не определена - person Troy Bryant; 05.10.2017
comment
@TroyBryant, мой измененный ответ, вы проверили? Он уже проверяет категорию - person Fetrarij; 05.10.2017
comment
Позвольте нам продолжить это обсуждение в чате. - person Troy Bryant; 05.10.2017