3

Is it possible to add a component in the root component template and being able to access it from a child component. For example, imagine this is the root app component:

<main>
   <global-component #globalComponent></global-component>
   <child-component></child-component>
</main>

What I would like is, in the code of "child-component", being able to do something like this:

@Component({...})
export class ChildComponent
{
    @SomethingAwesome(GlobalComponent) globalComponent: GlobalComponent;
}

The goal is to be able to display errors/warning always in the same way. The "GlobalComponent" template would be a modal message and I want to be able to display it whenever I want. For example:

...
this.globalComponent.ShowError("Something's weird in here !");
...

The alternative (I guess) I have in mind is creating a service with an observable that "GlobalComponent" would subscribed to and react accordingly but I'm wondering if what I asked is possible.

Edit:

In the example, components are siblings but it might not always be the case. "GlobalComponent" should be available in any component, whatever its "deepness".

Thanks

1 Answer 1

4

If they are siblings, you can just pass it in

<main>
   <global-component #globalComponent></global-component>
   <child-component [global]="globalComponent"></child-component>
</main>
@Component({...})
export class ChildComponent
{
    @Input() global: GlobalComponent;

    ngOnInit() {
      console.log(this.global);
    }
}
Sign up to request clarification or add additional context in comments.

5 Comments

They are siblings in my example but the goal is to be able to access "globalComponent" from any component. Sibling or not. Sorry if it was not clear.
Then you need a shared service. The GlobalComponent can inject the shared service and register itself with the service and other components that access the same service can access GlobalComponent there. A better option is to have an Observable in the shared service and use that to communicate between components. One is the subscriber, the other the emitter.
Mmmmh, that's what I thought... Ok, I'll do it that way then. Thanks.
I just did it and it works. I marked the initial answer as accepted even though it's more the one in comment that solved my issue. Thanks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.