Angular,RxJS,Observable,Observer

0

Witam.

Mam nadzieje, ze odpowiedni dzial.
Ucze sie z ksiazki Freemana Angulara i w rozdziale o RxJS ciagle w kodzie wystepuje jakis blad. Jest to fragment z Observable i Observer. Najpierw pojawia sie blad, ze nie mozna rozwiazac dwoch parametrow, gdy klasa oryginalnie miala konstruktor z dwoma parametrami. Po zmianie na zdefiniowanie na sztywno parametrow w klasie bez konstruktora(podobno Typescript ma problem gdy konstruktor ma parametry-taka znalazlem porade i tego zupelnie nie rozumiem)blad zniknal. Wtedy pojawil sie kolejny: mianowicie ze funkcja subscribe nie jest funkcja, a ktora wedlug ksiazki jest prawidlowa, nalezaca do obiektu stanZdarzen, ktory jest Observable<wspoldzielonyStan> i wspoldzielonyStan ma wlasnie te dwa wspomniane wczesniej parametry. Wewnatrz subscribe mam kod z ksiazki, a w linii
this.observer.next(new WspoldzielonyStan(TRYBY.EDYTUJ,id));
gdzie po prostu to powinno dzialac, wystepuje blad, gdy podaje parametry wewnatrz konstruktora, jesli mam wersje oryginalna, a gdy podaje konstruktor pusty to nie ma bledu z dwoma parametrami, ale to jest bez sensu i wtedy wlasnie jest ten drugi blad z subscribe. Czy jest mozliwe, ze wszystko robie dobrze i pojawiaja sie takie bledy, i jak je naprawic prawidlowo i skutecznie czy jednak cos musialem zrobic zle, mimo, ze sprawdzalem kilka razy i nie moge znalezc roznic miedzy ksiazka a moim kodem. I jesli ktos dobrze powiedzial, ze Typescript ma problem z parametryzowanymi konstruktorami, to jak to obejsc, przeciez to jest jakies nienormalne. Prosze o pomoc, pozdrawiam.

0

Sformatuj ten tekst, albo nikt tego nie przeczyta.

0

Projekt sklada sie z formularza i listy zakupow(do tej pory dzialal przy roznych wczesniejszych modyfikacjach swoich i z ksiazki). Przy uzyciu RxJS ma byc zapewnione wyswietlanie w zaleznosci od sytuacji edycji lub dodawania zakupu. Zamieszczam tylko najpotrzebniejsze fragmenty:

plik: wspoldzielonyStan.model.ts:

import { InjectionToken } from "@angular/core";

export enum TRYBY {

  KREUJ, EDYTUJ

}

export class WspoldzielonyStan {

  constructor(tryb: TRYBY = TRYBY.KREUJ,id?: number) {}   // TUTAJ POJAWIAJA SIE BLEDY

}

export const WSPOLDZIELONY_STAN = new InjectionToken("wspoldzielony_stan");

plik: formularz.komponent.ts:

...

import { Component,Inject } from "@angular/core";
import { TRYBY, WSPOLDZIELONY_STAN, WspoldzielonyStan } from "./wspoldzielonyStan.model";
import { Observable } from "rxjs/Observable";

...

constructor(private model: Model, 
    @Inject(WSPOLDZIELONY_STAN) private stanZdarzenia: Observable<WspoldzielonyStan>) {

    stanZdarzenia.subscribe((uaktualnienie) => {      // TUTAJ POJAWIAJA SIE BLEDY

      this.nowyZakup = new Zakup();

      if (uaktualnienie.id != undefined) {

        Object.assign(this.nowyZakup, this.model.zwrocZakup(uaktualnienie.id));

      }

      this.editing = uaktualnienie.tryb == TRYBY.EDYTUJ;
    });

  }

  public editing: boolean = false;

...

plik lista.komponent.ts:

import { Component, Inject } from "@angular/core";

...

import { WspoldzielonyStan, TRYBY, WSPOLDZIELONY_STAN } from "./wspoldzielonyStan.model";
import { Observer } from "rxjs/Observer";

...

constructor(private model: Model, private zamieniacz: ZamienUsluga, @Inject(WSPOLDZIELONY_STAN) private obserwator: Observer<WspoldzielonyStan>) { }

...

edytujZakup(id: number) {

     this.obserwator.next(new WspoldzielonyStan(TRYBY.EDYTUJ, id));    // TUTAJ POJAWIAJA SIE BLEDY
   
  }

  utworzZakup(id: number) {

    this.obserwator.next(new WspoldzielonyStan(TRYBY.KREUJ));      // TUTAJ POJAWIAJA SIE BLEDY

  }

...

0

Dodam, ze to wszystko jest jak w ksiazce i autor mowi tutaj cos o uszkadzaniu projektu, a ze pozniej w tym rozdziale bedzie dzialac, a pozniej tez nie dziala, a problem pojawia sie tutaj.
Gdy wszystko jak przedstawione wyzej, to wtedy sa tylko i az te komunikaty:

Uncaught Error: Can't resolve all parameters for WspoldzielonyStan: (?, ?). at syntaxError (compiler.js:486) at CompileMetadataResolver._getDependenciesMetadata (compiler.js:15706) at CompileMetadataResolver._getTypeMetadata (compiler.js:15541) at CompileMetadataResolver._getInjectableMetadata (compiler.js:15521) at CompileMetadataResolver.getProviderMetadata (compiler.js:15881) at eval (compiler.js:15792) at Array.forEach (<anonymous>) at CompileMetadataResolver._getProvidersMetadata (compiler.js:15752) at CompileMetadataResolver.getNgModuleMetadata (compiler.js:15320) at CompileMetadataResolver.getNgModuleSummary (compiler.js:15139)

Gdy brak konstruktora, czyli konstruktor domyslny bez parametrow i parametry na sztywno w klasie(bez sensu, ale zeby to tez wyprobowac) i utworzenie obiektu z argumentami to znika ten powyzszy blad i jest tylko to, co nizej, czyli logiczne:

ERROR in src/app/rdzen/lista.komponent.ts(85,26): error TS2554: Expected 0 arguments, but got 2. src/app/rdzen/lista.komponent.ts(95,26): error TS2554: Expected 0 arguments, but got 1.

Obserwator w podpowiedzi gdy na niego najade w kodzie poza konstruktorem jest: (property) ListaZakupowKomponent.obserwator: Observer<WspoldzielonyStan>, gdzie klasa w ktorej pojawia sie obserwator to wlasnie ListaZakupowKomponent.

I dzieki Aisekai za probe pomocy!

0

Okazalo sie,ze pierwszy plik: wspoldzielonyStan.model.ts powinien wygladac tak:

import { InjectionToken } from "@angular/core";

export enum TRYBY {

  KREUJ, EDYTUJ

}
@Injectable()  // brakowalo dekoratora @Injectable i bez niego pojawial sie blad :"can't resolve all parameters for wspoldzielonyStan(?,?)"
export class WspoldzielonyStan {

  constructor(tryb: TRYBY = TRYBY.KREUJ,id?: number) {}   // TUTAJ POJAWIAJA SIE BLEDY

}

export const WSPOLDZIELONY_STAN = new InjectionToken("wspoldzielony_stan");

Wtedy reszta jest prawidlowa i dobrze dziala, mozna tak uzywac Observable,Observer i @Inject.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.