Tengo una matriz Observable y quiero filtrar/encontrar el Proyecto por nombre. Cuando trato de usar la opción de filtro, dice
ProjectService.ts
import { Injectable } from '@angular/core'; import { Project } from "../classes/project"; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/observable/of'; import { Http } from '@angular/http'; @Injectable() export class ProjectService { private projects: Observable<Project[]>; constructor(private http: Http) { this.loadFromServer(); } getProjects(): Observable<Project[]> { return this.projects; } private loadFromServer() { this.projects = this.http.get('/api/projects').map(res => res.json()); } getProjectByName(name: String) { return this.projects.filter(proj => proj.name === name); } }Clase de proyecto
export class Project { public name: String; public miniDesc: String; public description: String; public category: String[]; public images: any[]; }debería ser:
getProjectByName(name: String) { return this.projects .map(projects => projects.filter(proj => proj.name === name)); } entendiste mal sobre el operador de filtro. El operador que se usa para filtrar los datos devueltos de la secuencia. Su flujo devuelve una matriz de objetos, por lo que necesita una filter array para obtener el valor que necesita.
La solución anterior devolverá una matriz después de filtrada, si desea obtener solo un valor, use la siguiente solución
getProjectByName(name: String) { return this.projects .map(projects => { let fl = projects.filter(proj => proj.name === name); return (fl.length > 0) ? fl[0] : null; }); }En su Servicio, puede definir el tipo <any> o el tipo Project[] para devolver el valor de respuesta y lo mismo podría continuar con el filtro. por ejemplo <any>res.json() o <Project[]>res.json()
y también actualice su clase como lo sugiere @Sajeetharan
ProjectService.ts
import { Injectable } from '@angular/core'; import { Project } from "../classes/project"; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/observable/of'; import { Http } from '@angular/http'; @Injectable() export class ProjectService { private projects: Observable<Project[]>; constructor(private http: Http) { this.loadFromServer(); } getProjects(): Observable<Project[]> { return this.projects; } private loadFromServer(): Observable<any> { this.projects = this.http.get('/api/projects').map((res: Response)=> <any>res.json()); } getProjectByName(name: string) { return this.projects.filter(proj => proj.name === name); } }*siempre escribe tus filtros, condiciones o manipulación en componente no en servicios.