Странное поведение подписки - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю с Angular 6, и у меня странное поведение подписки, поэтому, когда я трижды вызываю метод reload из конструктора, он работает нормально, и я получаю три сообщения журнала «подписаться».

Но когда я нажимаю кнопку, которая имеет (click) = "reload ()", перезагрузка выполняется, но подписка никогда не выполняется.

компания-edit.component.ts

export class CompanyEditComponent implements OnInit {
company$ : Observable<any>;
company: Company;
formCompany: Company;
refDb: any;

  constructor(private db: AngularFireDatabase, private companyService: CompanyService) {
    this.refDb = db.object('company');
    this.company$ = this.companyService.getCompanyObservable();
    this.reload();
    this.reload();
    this.reload();
  }

  reload(){
    console.log("reload");
    this.refDb = this.db.object('company');
    this.company$ = this.companyService.getCompanyObservable();
    this.formCompany = new Company("","");
    this.company$.subscribe( (company)=>{ console.log("subscribe");

      this.company = company;
      console.log(this.company);

      if (company)
        this.formCompany = company;
    });
    // this.formCompany = {"name":"kk","fondator":"gg"};
  }

компания-edit.component.html

<div>
        <mat-form-field>
            <input matInput [(ngModel)]="formCompany.name" placeholder="Name">
        </mat-form-field>
        <br>
        <mat-form-field>
            <input matInput [(ngModel)]="formCompany.fondator"  placeholder="Fondateur">
        </mat-form-field>
        <br>
        <button mat-raised-button color="primary"(click)="submit()">Save</button> |
        <button mat-raised-button color="accent"(click)="update()">Update</button> |
        <button mat-raised-button color="warn"(click)="delete()">Delete</button> |
        <button mat-raised-button color="" (click)="reload()">Reload</button>
    </div>

company.service.ts

export class CompanyService {
  company$ : Observable<any>;
  refDb: any;

    constructor(private db: AngularFireDatabase) {
      this.refDb = db.object('company');
      this.company$ = this.refDb.valueChanges();
    }

    getCompanyObservable(){
      return this.company$;
    }

1 Ответ

0 голосов
/ 17 ноября 2018

Похоже, вам нужно последнее значение, полученное с сервера. Вы можете добиться того же, используя BehaviorSubject

export class CompanyService {
  //company$ : Observable<any>;

   public data: BehaviorSubject<any> = new BehaviorSubject(null);

   refDb: any;

    constructor(private db: AngularFireDatabase) {
      this.refDb = db.object('company');
      //this.company$ = this.refDb.valueChanges();
      this.refDb.valueChanges().subscribe(data=>this.data.next(data));
    }

    getCompanyObservable(){
      return this.data.asObservable();
    }
...