2017-09-26 3 views
0

ich eine beobachtbare eines Arrays haben:Angular 4 rxjs: Filter Daten in beobachtbaren Array

schools: Observable<SchoolVM[]>; 

Und ich brauche diese beobachtbaren in eine andere für eine automatische Vervollständigung wählen

filteredSchools: Observable<SchoolVM[]>; 

Ich abonniere filtern die form.valueChanges

this.formChange = this.searchForm.valueChanges 
    .debounceTime(300) 
    .subscribe(value => { 
    this.filteredSchools = this.schools.filter(s => s.SchoolName == value); 
    }); 

ich habe einen Fehler auf: Anwesen ‚School‘ nicht auf Typ Sch existiert‘ oolVM [] ' Wie kann ich es lösen? Und auch: Ich muss nach 2 verschiedenen Kriterien filtern. Es ist richtig, zu filtern, wie

this.filteredSchools = this.schools.filter(s => s.SchoolName == value || 
    s => s.SchoolName == value); 

ich die Funktion folgende Aakash Jain's answer neu geschrieben, wie folgt aus:

this.formChange = this.searchForm.valueChanges 
     .debounceTime(300) 
     .subscribe(value => { 
     this.filteredSchools = this.schools.map(schools => { 
      return schools.filter((school: SchoolVM) => (school.SchoolName === value) || (school.City === value)); 
      // this.logger.info(this.filteredSchools); 
     }); 
     }); 

und jetzt bekomme ich die Fehlermeldung „schools.filter“ keine Funktion.

die beobachtbaren

schools: Observable<SchoolVM[]>; 

von einem Httpclient Aufruf gefüllt ist:

this.schoolService.filterSchools(arg) 
     .subscribe(d => {this.schoolsToFilter = d; }) 

Und im Dienst:

filterSchools(arg: string): Observable<any> { 
    return Observable.from(this.http.get('/api/school/find/' + arg)); 

Vielleicht ein Problem mit beobachtbaren ihr ist, aber die Schulen beobachtbar ist gut gefüllt:

{ "SchoolID": 13028, "School": "100% Conduite", "Stadt": "MEUDON", "ZipCode": "92190", "Street": "17 rue des Gallons" , "Phone": "01 49 66 06 02" }, { "SchoolID": 6803, "School": "100% PERMIS" "Stadt": "BADONVILLER" "ZipCode": "54540", "Street": "25 rue du Maréchal Foch", "Phone": "" }, ...

Antwort

1

schools und filteredSchools sind Observables, die jeweils ein Array von SchoolVM Objekten enthalten. So

, wenn Sie dies tun:

this.schools.subscribe(s => console.log(s)); 

Sie werden feststellen, dass eine Reihe von SchoolVM gedruckt wird. Also der Wert von s oben ist keine einzige SchoolVM, sondern stattdessen eine SchoolVM[].

Als solcher, wenn Sie schreiben:

this.filteredSchools = this.schools.filter(s => s.SchoolName == value); 
// this will not work since s is an array 

Statt dessen, was Sie tun möchten, ist:

this.filteredSchools = this.schools.map(schools => { 
    return schools.filter((school: SchoolVM) => school.SchoolName === value); 
}); 

durch zwei Bedingungen zu filtern, Ihren Weg falsch ist. Sie definieren zwei anonyme Funktionen. Dies wird Ihnen einen Syntaxfehler geben. Stattdessen möchten Sie eine anonyme Funktion mit der ODER-Bedingung.

this.filteredSchools = this.schools.map(schools => { 
    return schools.filter((school: SchoolVM) => (school.SchoolName === value) || (school.NumberOfStudents >= 100)); 
}); 
+0

schrieb ich die automatische Auswahl Code wie folgt aus: this.formChange = this.searchForm.valueChanges .debounceTime (300) .subscribe (Wert => { this.filteredSchools = this.schools.map (Schulen => { zurück schools.filter ((schule: SchoolVM) => (school.SchoolName === wert) || (school.City === wert)); // this.logger.info (this.filteredSchools); }); }); und jetzt bekomme ich den Fehler "schools.filter ist keine Funktion". Irgendwelche Hilfe bitte? – Marcos

+0

@Marcos versuchen 'this.formChange = this.searchForm.valueChanges.debounceTime (300) .subscribe (value => this.schools.subscribe (Schulen => console.log (Schulen)))' und lassen Sie mich wissen, was es protokolliert. –

+0

Vielen Dank für Ihre Hilfe Aakash. Mit Ihrer Funktion habe ich den Fehler ERROR TypeError: _this.schools.subscribe ist keine Funktion. Vielleicht, weil Schulen Observable ist? – Marcos

Verwandte Themen