2015-07-25 11 views
7

angolare 2: 2.0.0-alpha.31/tipografico 1.5come gestire i servizi in Angular2

Attualmente gestisco il mio servizio come un semplice Class, poi ho iniettare questo Class in un altro componente. Esempio:

export class PlayerService { 
    http: Http; 
    players = []; 

    constructor(@Inject(Http) http) { 
     this.http = http; 
    } 

    getAll(callback) { 
     this.http.get('/data/players.json') 
       .toRx() 
       .map((res) => res.json()) 
       .subscribe((data) => { 
        this.players= data; 
        callback(data); 
       }); 
    } 

    add(player) { 
     //call webservice to save user 
     this.players.push(player); //only if save has work 
    } 
    delete(player) { 
     //Not implemented yet 
    } 
    get(id) { 
     //Not implemented yet 
    } 
} 

penso, lo sto facendo nel modo sbagliato ..

  • sto usando http.get().toRx().subscribe()? Ho pensato di vedere che alcune persone restituiscono lo Observable direttamente da toRx()
  • Se due componenti richiedono i giocatori (getAll()) contemporaneamente, verranno eseguite due query. Devo gestire la bandiera o c'è un altro modo?
  • Sto lavorando qui con un callback. Cosa devo fare se voglio che i dati "immediatamente" (senza asincrono)
  • Il components sarà automaticamente informato sui giocatori add/remove? Devo usare qualche tipo di evento per gestire questo (qualsiasi esempio?)?

Quindi la mia domanda è:

  • Esiste un modo comune per gestire i servizi in Angular2?
+1

se le sue promesse, come, del suo meglio per loro ritorno dallo strato di servizio invece di passare callback –

+1

Non è possibile rispondere tutte queste domande, ma [stanno progettando di cambiare l'API] (https://github.com/angular/angular/issues/2794). –

risposta

4

Prima di tutto il servizio è ben fatto come l'avete fatto, ed è il modo di andare con Angular2: A iniettato negli altri componenti.

Detto questo, sulle altre questioni che ha sollevato, preferirei tornare e memorizzare il risultato in una promessa invece di utilizzare un callback:

getAll() { 
    return players || players = new Promise(
     (resolve) => this.http.get('people.json').observer({next: resolve}) 
    ); 
} 

Nota: Si dovrebbe essere in grado di utilizzare Osservabile .toPromise() ma per qualche motivo non funziona per me in Angular2

In questo modo ulteriori chiamate a getAll() non attiveranno più risposte.

Per le domande sincrone, non dovresti farlo. Ora che hai una promessa, chiama semplicemente getAll() e restituisci una promessa quando viene richiesto un giocatore.

get(id) { 
    return getAll().then((result) => {return Promise.resolve(result[id])}); 
} 

A proposito del modo di gestire Giocatori aggiunte e rimozioni, che è esattamente ciò che osservabili sono destinati al RxJS. Devi fornire e Stream osservabile che avvisi i suoi osservatori quando l'elenco dei giocatori cambia. È possibile utilizzare l'EventEmitter per questo:

constructor(@Inject(Http) http) { 
    this.http = http; 
    this.myEventEmitter = new EventEmitter(); 
} 

getUpdateStream() { 
    myEventEmitter.toRx(); 
} 

Quando si cambia la lista dei giocatori basta fare myEventEmitter.next(players)

Problemi correlati