2017-10-11 2 views
3

Auf der Last der Komponente Ich abonniere ein Array von Werten und zeigt das gleiche in List und Drop Down, die gut funktioniert. Dann habe ich "Add button" hinzugefügt, der ein Objekt zu einem Array hinzufügt und dasselbe in einer Liste anzeigt.Abbrechen eines Abonnements in eckigen 2/4

Ausgabe ist wie auch, wenn ich aus dem Abonnement bin abzumelden selbst dann wird es den Wert hinzuzufügen, wenn ich auf Schaltfläche Hinzufügen bin klicken, könnte jemand mir bitte mitteilen, warum diese

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

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

und Servicecode

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

Kannst du einfach .first() von rxjs tun? Sie müssen sich also nicht abmelden und es ist nur einer? – misha130

+3

Hallo, überlege dir, deinen Code das nächste Mal zu formatieren, wenn du möchtest, dass jemand es liest und dir hilft. –

Antwort

2

Sie können die Änderungen Ihrer addPhone-Methode auch dann sehen, wenn Sie sich vorher abmelden, da Ihre Methode das in der Komponente verwendete Array manipuliert.

Stattdessen sollten Sie Ihr vorhandenes Array kopieren und das neue Element zum kopierten Array hinzufügen. Mit dem Spread-Operator könnte das so einfach sein wie:

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

Also die Daten, die ich von meiner subscribe-Methode bekomme, gibt das ursprüngliche Array zurück und als Array wird als Referenz übergeben Es ist Objekt in JavaScript Werte werden an das ursprüngliche Array angehängt, ich dachte, wenn ich Array zu Observable konvertieren wird es einige Wrapper auf Array setzen oder es wird Strom von dem, den wir abonnieren können, erstellen, was nicht der Fall ist –

+0

Selbst wenn RxJS und Observables sehen magisch aus, am unteren Ende ist es nur ein Callback-Mechanismus, der die gegebenen Werte weitergibt, ohne irgendeinen Pixie-Staub darauf anzuwenden. – Oliver

Verwandte Themen