2016-04-06 25 views
5

ho bisogno di qualche chiarimento sul legame tra servizio e componenti proprietà e di dati in angular2dati angular2 legame tra le proprietà di servizio e del componente

assumere ho un servizio (singolo) e un componente

export class Service { 
name = "Luke"; 
object = {id:1}; 
getName(){return this.name}; 
getObject(){return this.object}; 
} 

export class Component implements OnInit{ 
name:string; 
object:any; 
constructor(private _service:Service){} 
ngOnInit():any{ 

    //Is this 2 way binding? 
    this.name = this._service.name; 
    this.object = this._service.object; 

    //Is this copying? 
    this.name = this._service.getName(); 
    this.object = this._service.getObject(); 
    } 
} 

risposta

5

Se si aggiorna gli elementi di riferimento (se si aggiorna qualcosa nella proprietà object), si vedrà gli aggiornamenti in vista:

export class Service { 
    (...) 

    updateObject() { 
    this.object.id = 2; 
    } 
} 

Se si aggiorna gli elementi per valore (se si aggiorna qualcosa nella name proprietà), non sarà possibile visualizzare gli aggiornamenti nella vista:

export class Service { 
    (...) 

    updateName() { 
    this.name = 'Luke1'; 
    } 
} 

Vai a questa plunkr: https://plnkr.co/edit/w7bS0fAVjOc3utnpD39b?p=preview.

+0

Vedo, perché nel primo caso ive ha creato due riferimenti che puntano verso lo stesso oggetto, mentre il sotto avrei voluto "copiare" di nuovo la proprietà? –

+0

ma aspetta, vuol dire che se ho un tipo di dati di riferimento in un servizio Singleton e creo nuovi riferimenti puntati verso di esso in vari componenti, la vista si aggiornerà automaticamente ogni volta che la sto cambiando ?? –

+1

@HanChe, sì, le viste verranno aggiornate automaticamente, poiché tutti i collegamenti dei modelli sono associati allo stesso/un oggetto.Tutti i componenti hanno i propri riferimenti, ma puntano tutti allo stesso servizio Singleton, quindi tutti i bind dei modelli hanno i propri riferimenti, ma puntano tutti allo stesso oggetto all'interno di Singleton. Quindi tutto funziona. –

6

angolare l'associazione funziona solo per i collegamenti dichiarati nella vista (HTML).

Se si desidera che le proprietà nel componente vengano aggiornate quando si modificano i valori in un servizio, è necessario prendersene cura personalmente.

Gli oggetti di osservazione lo rendono facile. Vedi detect change of nested property for component input per un esempio.

+0

Hi Günter, grazie per la tua risposta e sì sono sull'osservabile, ma in caso di this.name = this._service.name; cosa fa, è solo una semplice copia? –

+0

Sì, copia il valore una volta quando viene chiamato 'ngOnInit()'. Se per esempio il servizio acquisisce i dati da un server remoto utilizzando una richiesta HTTP, allora potrebbe non esserci ancora un valore in 'this.service.name'. Se il servizio riceve successivamente la risposta dal server, il componente non ottiene il nuovo valore. –

+0

il ngOnInit() era solo un esempio, ma quale sarebbe la differenza tra l'uso di this.service.name e this.service.getName()? È come in java se dichiaro il nome come privato nel servizio per proteggerlo e usare getter e setter? –

0

Se si desidera immobili a un aggiornamento dei componenti non appena un valore in cambio di un cambiamento di servizio:

  1. Importa DoCheck dal @angular/core e la tua service nel componente .
  2. richiamare le funzioni di servizio che interessano la proprietà del componente in ngDoCheck(){...}
  3. La vista componente verrà aggiornato automaticamente non appena tutti i cambiamenti

Qualcosa di simile nel componente:

ngDoCheck() { 
    this.qty = this.cartService.getTotalQtyInCart(); 
    }