I am making a 'skip to content' link. The link is in app.component and the content is in login.component, along with the target.
I've tried several methods, none of which worked out. So now I'm trying emitter/listener:
app.component (emitter):
import { Component, Output, EventEmitter} from '@angular/core';
export class AppComponent {
@Output() skipToCtrl: EventEmitter<any> = new EventEmitter();
skipLink() {
this.skipToCtrl.emit();
}
}
<a href="#content-start" (click)="skipLink()">Skip to main content</a>
login.component (listener):
<input type="text" #firstControl name="username" />
Don't know how login can subscribe to the event from within login. I keep finding articles that say not to do it How to subscribe to an event on a service in Angular2? but no articles that describe how to do it.
EventEmitterlink. Use in components with the @Output directive to emit custom events synchronously or asynchronously, and register handlers for those events by subscribing to an instance.
Both are used to transform the data from one component to another component. Or, you can say pass the different types of data from parent to child component and child to parent component. Or, in a simple way transform/exchange data between two-component.
subscribe() is an EventEmitter method that registers handlers for events emitted by this instance. subscribe() have three optional parameters which can be used to pass values, errors, or completion notification in EventEmitter . The next parameter is a custom handler for emitted events.
Event emitters are used to add output into the templates. Using the round brackets ()
for binding to the event.
When you create a component:
@Component({...})
public export FooComponent {
@Output() name: EventEmitter = new EventEmitter<string>();
}
The above component now has an attribute that can be used with the ()
brackets in another template.
In another template:
<foo (name)="// code here //"></foo>
When the event is emitted (by calling this.name.emit("value")
) the above "code here" expression is executed by Angular. The emit
function takes a single argument which is passed to the expression as a $event
variable.
To have another component receive these events is to use the expression in that other component's template.
Let's create a Bar
component
@Component({...})
export class BarComponent {
public setName(value:string) {
console.log(value); // will output "chicken"
}
}
The above component has this template:
<foo (name)="setName($event)"></foo>
Now in the Foo
component we emit a value.
@Component({...})
public export FooComponent implements OnInit {
@Output() name: EventEmitter = new EventEmitter<string>();
public ngOnInit() {
this.name.emit("chicken");
}
}
This creates one-way communication from the Foo
component to the Bar
component via the template expressions.
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