27 votes

Le comportement de l'objet de valeur initiale nulle?

private customer: Subject<Object> = new BehaviorSubject<Object>(null);

setCustomer(id, accountClassCode) {
    this.customer.next({'id': id, 'accountClassCode': accountClassCode});
}

getCustomer() {
    return this.customer.asObservable();
}

Je suis sur cette partie de code, mais j'obtiens une erreur qui ne peut pas trouver l'id de la valeur null. Est-il une solution pour obtenir la valeur initiale n'est pas nulle?

59voto

estus Points 5252

Le but de l' BehaviorSubject est de fournir de la valeur initiale. Il peut être null ou quoi que ce soit d'autre. Si aucun valeur initiale peut être fourni (lorsque l'utilisateur id n'est pas encore connu), il ne devrait pas être utilisé.

ReplaySubject(1) offre un comportement similaire (émet de la dernière valeur sur l'abonnement) mais n'a pas de valeur initiale jusqu'à ce qu'il est configuré avec l' next.

Il devrait être

private customer: Subject<Object> = new ReplaySubject<Object>(1);

2voto

SrAxi Points 8077

Essayez de structuration de cette façon, votre service:

Service:

@Injectable()
export class MyService {
    customerUpdate$: Observable<any>;

    private customerUpdateSubject = new Subject<any>();

    constructor() {
        this.customerUpdate$ = this.customerUpdateSubject.asObservable();
    }

    updatedCustomer(dataAsParams) {
        this.customerUpdateSubject.next(dataAsParams);
    }
}

N'oubliez pas d'ajouter MyService des prestataires.

Lorsque vous mettez à jour votre client (si c'est le cas), vous faites quelque chose comme cela:

Composant (celui qui déclenche):

constructor(private myService: MyService) {
        // I'll put this here, it could go anywhere in the component actually
        // We make things happen, Client has been updated
        // We store client's data in an object
        this.updatedClient = this.myObjectWithUpdatedClientData;  // Obj or whatever you want to pass as a parameter
        this.myService.updatedCustomer(this.updatedClient);
    }

Composant (celui qui est Abonné):

this.myService.customerUpdate$.subscribe((updatedClientData) => {
            // Wow! I received the updated client's data
            // Do stuff with this data!
        }
    );

De ce que j'ai compris, vous êtes en essayant de passer des données à partir de 1 composant à l'autre. Vous obtenez de votre Client données et de les envoyer sur votre Application à un autre composant, à droite? C'est pourquoi j'ai posté cette solution.

Si vous êtes intéressé par d'autres types d'abonnements, lisez ceci:

Angulaire 2 spécial Observables (Objet et / ou du Comportement du sujet / ReplaySubject)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X