инициализировать переменную внутри подписки (rxjs) всегда неопределенно Angular 6 - PullRequest
0 голосов
/ 11 апреля 2019

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

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

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>

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

После объяснения @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>
0 голосов
/ 11 апреля 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...