This question is quite simple but I can't get rid of it.
I have a <header>
in parent template and I need it disappear when displaying children template through routing module. What I expect is adding a class to the header tag so I can hide it via CSS. This is what I have:
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app',
template: `
<header [class.hidden]="hide">
<h1>My App</h1>
<ul>
<li><a href="/home"></a></li>
<li><a href="/showoff"></a></li>
</ul>
</header>
<router-outlet></router-outlet>
`
})
export class AppComponent {
hide = false; // <-- This is what I need to change in child component
}
app-routing.module.ts
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './welcome.component';
import { ShowOffComponent } from './show.off.component';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'showoff', component: ShowOffComponent },
];
export const AppRouting = RouterModule.forRoot(routes, {
useHash: true
});
show.offf.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-showoff',
template: `
<h2>Show Off</h2>
<div>Some contents...</div>
`
})
export class ShowOffComponent {
hide = true; // <-- Here is the problem.
// I don't have any idea how to reach parent variables.
}
To pass data from child to parent component in React: Pass a function as a prop to the Child component. Call the function in the Child component and pass the data as arguments. Access the data in the function in the Parent .
You can create a state variable in the parent component, and then pass the setXXX method to the child component, in the child component call the setXXX method to pass the boolean variable to the parent.
You can use output emitter
In your child component,
import { Component } from '@angular/core';
@Component({
selector: 'app-showoff',
template: `
<h2>Show Off</h2>
<div>Some contents...</div>
`
})
export class ShowOffComponent {
@Output() onHide = new EventEmitter<boolean>();
setHide(){
this.onHide.emit(true);
}
}
In the parent,
export class AppComponent {
hide = false;
changeHide(val: boolean) {
this.hide = val;
}
}
Add a child to the parent with that event emitter,
<app-showoff (onHide)="changeHide($event)"></app-showoff>
I have bumped into the same phenomena very recently with Angular 6.
I wanted to access and change a variable which is belongs to a parent or a grandparent Component. See the image below. I want to access and change a variable which is belongs to Tom, from Jim (who is a child of Tom) and Sara (who is a grandchild of Tom).
There might be some other solutions but the approach I have used to overcome this is by using ViewContainerRef
. I have to inject the ViewContainerRef
to the Child component's constructor, that I need to access the parent Component and traversed through the parent node (or nodes) to find the parent variable.
Injecting to the constructor,
constructor(private viewContainerRef: ViewContainerRef) { }
Accessing and traversing through to the parent node,
getParentComponent() {
return this.viewContainerRef[ '_data' ].componentView.component.viewContainerRef[ '_view' ].component
}
I have made a StackBlitz example with the scenario that I have given you in the above picture.
https://stackblitz.com/edit/angular-comms
Hope someone will find this useful.
Thank you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With