2016-04-06 2 views
5

j'ai besoin des éclaircissements sur la liaison entre les services et les propriétés des composants et liaison de données dans angular2données angular2 de liaison entre le service et les propriétés des composants

suppose avoir un service i (singleton) et un composant

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(); 
    } 
} 

Répondre

5

Si vous mettez à jour des éléments de référence (si vous mettez à jour quelque chose dans la propriété object), vous verrez les mises à jour dans la vue:

export class Service { 
    (...) 

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

Si vous mettez à jour les éléments de valeur (si vous mettez à jour quelque chose dans la name la propriété), vous ne verrez pas les mises à jour à la vue:

export class Service { 
    (...) 

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

voir cette plunkr: https://plnkr.co/edit/w7bS0fAVjOc3utnpD39b?p=preview.

+0

Je vois, parce que dans le premier cas, ive a créé deux références pointant vers le même objet, alors que ci-dessous je voudrais net "copier" la propriété à nouveau? –

+0

mais attendez, cela signifie-t-il que si j'ai un type de données de référence dans un service singleton, et créer de nouvelles références pointant vers lui dans divers composants, la vue se mettra automatiquement à jour chaque fois que je le change ?? –

+1

@HanChe, oui, les vues seront toutes mises à jour automatiquement, car toutes vos liaisons de modèles sont liées au même objet.Tous vos composants ont leurs propres références, mais ils pointent tous vers le même service Singleton, puis toutes les liaisons de modèles ont leurs propres références, mais elles pointent toutes vers le même objet dans Singleton. Donc tout fonctionne. –

6

angulaire La liaison ne fonctionne que pour les liaisons déclarées dans la vue (HTML).

Si vous souhaitez que les propriétés de votre composant soient mises à jour lorsque les valeurs d'un service changent, vous devez en prendre soin vous-même.

Les observables rendent cela facile. Voir detect change of nested property for component input pour un exemple.

+0

Salut Günter, merci pour votre réponse et oui je suis sur les observables, mais dans le cas de this.name = this._service.name; que fait-il, est-ce juste une simple copie? –

+0

Oui, il copie la valeur une fois lorsque 'ngOnInit()' est appelé. Si, par exemple, le service acquiert les données d'un serveur distant en utilisant une requête HTTP, il se peut qu'il n'y ait pas encore de valeur dans 'this.service.name'. Si le service reçoit ultérieurement la réponse du serveur, le composant n'obtient pas la nouvelle valeur. –

+0

le ngOnInit() était juste un exemple, mais alors quelle serait la différence entre l'utilisation de this.service.name et this.service.getName()? Est-ce que c'est comme dans java si je déclare le nom comme privé dans le service pour le protéger et utiliser des getters et setters? –

0

Si vous voulez des propriétés dans une mise à jour des composants dès qu'une valeur changement dans un changement de service:

dans le composant
  1. importation DoCheck de @angular/core et votre service.
  2. appeler les fonctions de service affectant la propriété du composant dans ngDoCheck(){...}
  3. La vue des composants sera mis à jour automatiquement dès que tout changement

Quelque chose comme ça dans votre composant:

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