2017-08-25 1 views
0

J'ai le service suivant:Tapuscrit Cartographie des valeurs dans le modèle type

import { Component } from '@angular/core'; 
import { ApiService } from './shared/api.service'; 
import {PowerPlant} from './shared/models/powerplant.model'; 

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent { 
    powerPlants: PowerPlant[]; 

    constructor(private apiService: ApiService) { 
    } 

    allPowerPlants(onlyActive: boolean = false, page: number = 1): void { 
    const path = `$/powerPlants?onlyActive${onlyActive}&page${page}`; 
    this.apiService.get(path).map() // TODO: parse and set the JSON to my model 
    } 
} 

Dans la méthode get du apiService, c'est ce que je fais:

get(path: string, params: URLSearchParams = new URLSearchParams()): Observable<any> { 
    return this.http.get(`${environment.api_url}${path}`, { headers: this.setHeaders(), search: params }) 
     .catch(this.formatErrors) 
     .map((res: Response) => res.json()); 
    } 

Je voudrais donc analyser ce Json array, s'il y a des erreurs dans l'un des éléments du tableau, je voudrais l'ignorer et remplir le tableau powerPlant pour les autres qui sont valides! Des pointeurs?

EDIT: J'ai essayé la suggestion comme mentionné par le poste ci-dessous et je reçois une erreur comme le montre la capture d'écran:

enter image description here

Pourquoi est-ce? Est-ce que se plaindre que PowerPlant est une interface et j'ai besoin de fournir des valeurs pour les propriétés lorsque je crée une nouvelle instance de celui-ci?

+0

Alors, comment pouvez-vous détecter s'il y a une erreur dans l'un des éléments du tableau? –

+0

Je n'en ai aucune idée! Pourriez-vous s'il vous plaît m'aider avec quelques conseils sur la façon dont je pourrais faire cela? – sparkr

+0

Je suis un peu confus ici. Ainsi, une partie de l'élément de tableau peut avoir une erreur, mais vous n'êtes pas sûr de ce qui peut être considéré comme une erreur? Comme je ne suis pas un utilisateur angulaire, je vous suggère d'utiliser un callback dans la méthode 'map' de' this.apiService.get (chemin) .map() ', et d'assigner la valeur passée à la fonction callback à' powerPlants '; vous pouvez également utiliser 'console.log' dans la fonction de rappel pour vérifier si tout est en ordre ou non. –

Répondre

1

En supposant que votre service API renvoie un tableau d'objets, qui peut être considéré comme PowerPlant objet, voici ce que vous pouvez faire.

powerPlants: PowerPlant[] = []; //initialize the array. 

allPowerPlants(onlyActive: boolean = false, page: number = 1): void { 
    const self = this; 
    const path = `$/powerPlants?onlyActive${onlyActive}&page${page}`; 
    this.apiService.get(path).subscribe(
     powerplants:any[] => { 
      powerplants.forEach(item=>{ 
       if(isPowerPlant(item)){ 
        // cast the item as PowerPlant 
        self.powerPlants.push(item as PowerPlant); 
       } 
      }); 
     }, 
     err=> { 
      // handle error 
     }); 
} 

// define the type guard 
isPowerPlant(item:any):item is PowerPlant { 
    // check for the required properties of PowerPlant here and return true/false. 
    // example: 
    return item["powerplantProp1"] && item["powerplantProp2"]; 
} 

De plus, si votre service api est pas générique, vous pouvez choisir de revenir Observable<PowerPlant[]> de la méthode get au lieu de Observable<any>. Pour ce faire, vous pouvez utiliser (res: Response) => res.json() as PowerPlant[]. Cependant, ceci est juste pour le but de dactylographie.

Références:

  1. https://scotch.io/tutorials/angular-2-http-requests-with-observables
  2. https://basarat.gitbooks.io/typescript/docs/types/typeGuard.html

Hope this helps.

+0

J'ai essayé votre suggestion, mais j'ai l'impression d'avoir une erreur! J'ai édité mon post ci-dessus! – sparkr

+0

@sparkr si 'PowerPlant' est une interface, vous ne pouvez pas l'instancier en utilisant' new'. Dans ce cas, 'self.powerPlants.push (item comme PowerPlant);', ou simplement 'self.powerPlants.push (item);' devrait aussi suffire. –

+0

Oui, PowerPlant est une interface dans mon cas. Pourriez-vous mettre à jour votre asnwer? – sparkr