инициализировать переменную внутри subscribe (rxjs) всегда неопределенный Angular 6

#rxjs #angular6

#rxjs #angular6

Вопрос:

Я уже несколько месяцев работаю с Angular 6. У меня есть два компонента: первый (родительский) должен считывать параметр по http-запросу и инициализировать внутренний атрибут; второй (дочерний) принимает этот параметр, используя декоратор @Input для своего собственного атрибута. Я не могу установить родительский атрибут в методе subscribe, атрибут не определен. Есть предложения?

Родительский компонент:

 export class DeliberaComponent implements OnInit {

  private categoria: string = 'delibera';
  private prefix: string;

  constructor(private sistemaService: SistemaService) {
    this.sistemaService.readCategoriaAttributes(this.categoria)
    .subscribe(categoria => {
      this.prefix = categoria.listCategoriaAttribute.filter(attr => attr.chiave === 'prefixNamePdv').pop().valore; 
    });
  }

  ngOnInit() {
  }
}
  

Дочерний компонент:

 export class CreazioneManualeComponent implements OnInit {

  @Input()
  private prefix: string;
  private idpdv: string;

  ngOnInit() {
    this.idpdv = 
    this.prefix.concat(newDate().toDateString());
  }
}
  

Это фрагмент html:

 <sa-creazione-manuale [categoria]="categoria" [prefix]="prefix"></sa-creazione-manuale>
  

Ответ №1:

Если вы получаете информацию через http, у вас нет ответа до создания вашего дочернего компонента, поэтому при запуске ngOnInit префикс отсутствует.

вы можете сделать это….

     ngOnChanges(change: SimpleChanges) {
        If (change.prefix) {
            this.idpdv = 
            this.prefix.concat(newDate().toDateString());
        }
    } 
  

но это довольно дорого, поскольку он будет проверять if каждый раз, когда выполняется changeDetection в вашем дочернем компоненте…. Если вы можете, лучшей альтернативой было бы просто добавить дату в вашу строку непосредственно в subscribe родительского компонента. Вы также можете создать чистый канал, который сделает это за вас, если вы используете его в html дочернего компонента.

Ответ №2:

После объяснения @Tzannetos Philippakos я нашел рабочее решение:

 export class DeliberaComponent implements OnInit {

  private categoria: string = 'delibera';
  private prefix: string;
  @ViewChild(CreazioneManualeComponent)
  private childCreazioneManuale: CreazioneManualeComponent;

  constructor(private sistemaService: SistemaService) {
  }
  
  ngOnInit() {
  }
  
  ngAfterViewInit () {
    this.sistemaService.readCategoriaAttributes(this.categoria)
    .subscribe(categoria => {
      let prefix = categoria.listCategoriaAttribute.filter(attr => attr.chiave === 'prefixNamePdv').pop().valore;
      this.childCreazioneManuale.setPrefix(prefix); 
    });
  }
}  

В дочернем компоненте:

  setPrefix(prefix: string){
    this.idpdv = prefix.concat(new Date().toDateString());
    this.headerForm.controls['idpdv'].setValue(this.idpdv)
  }  

HTML:

 <sa-creazione-manuale [categoria]="categoria" ></sa-creazione-manuale>