web-dev-qa-db-fra.com

Comportement valeur initiale du sujet null?

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

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

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

J'utilise cette partie du code mais j'obtiens une erreur qui ne peut pas trouver l'id de null. Existe-t-il une solution pour obtenir une valeur initiale non nulle?

30
None

Le but de BehaviorSubject est de fournir une valeur initiale. Cela peut être null ou autre chose. Si aucune valeur initiale valide ne peut être fournie (lorsque l'identifiant de l'utilisateur n'est pas encore connu), il ne devrait pas être utilisé.

ReplaySubject(1) fournit un comportement similaire (émet la dernière valeur lors de la souscription) mais n'a pas de valeur initiale jusqu'à ce qu'il soit défini avec next.

Il devrait probablement être

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

Essayez de structurer 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 aux fournisseurs.

Lorsque vous mettez à jour votre client (si tel est le cas), vous procédez comme suit:

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

D'après ce que j'ai compris, vous essayez de transmettre des données d'un composant à un autre. Vous récupérez les données de vos clients et les envoyez via votre application à un autre composant, n'est-ce pas? C'est pourquoi j'ai posté cette solution.

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

2 observables spéciaux angulaires (Sujet/Sujet du comportement/ReplaySubject)

3
SrAxi