2017-10-11 6 views
3

Sur la charge du composant, je souscris à un tableau de valeurs et l'affiche dans List et Drop Down qui fonctionne correctement. Ensuite, j'ai ajouté "Ajouter un bouton" qui ajoute un objet à un tableau et montrant le même dans une liste.Annulation d'un abonnement dans l'angle 2/4

problème est le même quand je suis désinscris de l'abonnement même alors, il ajoute la valeur quand je suis en cliquant sur le bouton Ajouter, pouvait-s'il vous plaît laissez-moi savoir pourquoi cela se passe

Plunker: https://embed.plnkr.co/CoZCakFsx5q8GBWDBZ24/

ci-dessous est mon code

import {Component} from '@angular/core'; 
import {PhoneService} from './phone.service' 
import { ISubscription } from "rxjs/Subscription"; 

@Component({ 
    selector:'phone-list', 
    template:` 
    <ul> 
     <li *ngFor='let phone of phones'> 
     <a [routerLink]="['/phone',phone.id]"> 
      {{phone.name}} 
     </a> 
     </li> 
    </ul> 
    <select> 
     <option *ngFor='let phone of phones' value={{phone.name}}> 
     {{phone.name}} 
     </option> 
    </select> 
    <button (click)='add()'>Add</button> 
    ` 
}) 

export class PhoneListComponent { 

    private phones; 
    private phone$:ISubscription 

    constructor(private ps: PhoneService) { 

    this.phone$=this.ps.getPhoneDetails() 
     .subscribe((data)=> { 
     this.phones=data;console.log(data) 
     }); 
    } 

add() { 
    this.phone$.unsubscribe(); 
    this.ps.addPhone(); 
} 
} 

et le code de service

import 'rxjs/add/observable/of'; 
    import 'rxjs/add/operator/map'; 
    import { Injectable } from '@angular/core'; 
    import { Observable } from 'rxjs/Observable'; 

    export interface Phone { 
    id:number; 
    name:string; 
    } 

@Injectable() 
export class PhoneService { 
    private phoneList : <Phone>[] = [{ 
    name:'Huwaei', 
    id:1 
    },{ 
    name:'Apple', 
    id:2 
    }] 

    getPhoneDetails() { 
    return Observable.of(this.phoneList); 
    } 

    getPhone(id) { 

    return this.getPhoneDetails().map(phones=> 
    phones.find(phone=>phone.id==id) 
    ); 
    } 

    addPhone() { 
    this.phoneList.push({name:'dummy',id:3}); 
    } 

} 
+1

Pouvez-vous juste faire .first() de rxjs? Donc, vous ne devrez pas vous désabonner et c'est juste un? – misha130

+3

Salut, pensez à formater votre code la prochaine fois si vous voulez que quelqu'un soit prêt à le lire et vous aider –

Répondre

2

Vous pouvez voir les changements de votre méthode addPhone même si vous vous désabonnez à l'avance parce que votre méthode manipule la matrice qui a été utilisée dans votre composant. A la place, vous devez copier votre tableau existant et ajouter le nouvel élément au tableau copié. En utilisant l'opérateur de propagation, cela pourrait être aussi facile que:

addPhone() 
{ 
    this.phoneList = [ ...this.phoneList, {name:'dummy', id: 3}]; 
} 
+0

Donc les données que je reçois de ma méthode d'abonnement retournent le tableau original comme il est et comme Array sont passés par référence comme c'est Object dans JavaScript les valeurs sont ajoutées au tableau original, je pensais que quand je convertirais Array en Observable ça mettrait un peu de wrapper sur Array ou ça créerait un flux de ce à quoi on peut s'abonner, ce qui n'est pas le cas –

+0

RxJS et Observables ressemblent magiquement à quelque chose, au fond c'est juste un mécanisme de rappel qui transmet les valeurs données sans y appliquer de poussière de pixie. – Oliver