Как установить свойство дочернего компонента для использования в родительском конструкторе? - PullRequest
0 голосов
/ 13 апреля 2020

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

Я решил эту проблему с помощью промежуточного сервиса, потому что мне нужно сделать что-то в конструкторе базовых компонентов, что я не смог сделать в ngInit().

Я пытался использовать строковый параметр в конструкторе, например constructor(injector: Injector, holderName: string), но он не работает.

Есть ли более простая альтернатива использованию промежуточного сервиса?

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


@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css'],
  providers: [DataService]
})
export class ChildComponent extends ParentComponent implements OnInit {

  constructor(injector: Injector, childService:DataService ) { 
    childService.componentName = 'Child';
    super(injector, childService);    
    console.log('childService '+childService.componentName)   
  }

  ngOnInit() {
  }

}

Это мой базовый компонент


@Component({
  template: ''
})
export class ParentComponent {

  private componentName: string;

  constructor(injector: Injector, @Optional() parentService:DataService = null ) {
    if (parentService !== undefined &&  parentService !== null)
    {
      this.componentName = parentService.componentName;
      console.log('parentService '+parentService.componentName);   
      //Do Something important.

    }        
  }
}

@Injectable()
export class DataService {
  componentName:string=null;
}

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 13 апреля 2020

Удалите декоратор класса @Component из класса ParentComponent:

export class ParentComponent {

  private componentName: string;
  // maybe public? idk how you plan to use it
  constructor(injector: Injector, private holderName?: string) {
    if (this.holderName)
    {
      //Do Something important.

    }        
  }
}

нет соответствующего наследования компонента, поэтому нет причины объявлять его как компонент. Если вы хотите использовать нерасширенную форму в качестве компонента, просто переименуйте ее в ComponentBase и добавьте ParentComponent, чтобы расширить ее без holderName, и все дочерние элементы также расширят базу.

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