Handling User Interactions: Five Essential Event Bindings in Angular 18

When users interact with forms, what happens behind these interactions are some event bindings that are implemented to listen and execute specific functions when a user submits a form, clicks an input field, types, or clicks outside of an input field. This article will show you five essential bindings you must know.
Discover how at OpenReplay.com.
Let’s imagine a scenario where a car reverses because the gear is in reverse or where the vehicle abruptly stops due to the application of a brake. We can liken event bindings to the short examples given. What event bindings do is listen for a user’s interaction with various HTML elements and respond by doing something. So, now, a connection is created between the user interface and the logic by capturing events such as click
, input
, blur
, and other actions done by a user.
The use of forms makes it easy for users’ information to be captured in a database or processed for many purposes, including but not limited to event registration, surveys, or job applications. In this article, we’ll go through five important event bindings in Angular used when users interact with forms.
Understanding Real-Time Data Capture with Angular’s Input Event Binding
We now have an understanding of what event binding is, and in this section, we’ll look at one of the various types of event listeners.
The different types of event bindings listen for actions performed by a user differently, and this type, which we’ll discuss in this section, listens and triggers a function immediately when a user types. For example, when a user types a value in an input field, the input
event listener catches the changes made to that value in real-time just as the user types. Its importance is not limited to live search, form updates, and data validation.
Let’s look at an example to learn more.
In your event-binding.component.html
file, enter the code below:
<section class="border border-danger w-50 mt-4 p-4 form-section">
<div>
<h4 class="text-center">Contact Form</h4>
<form action="">
<div class="mt-3">
<label class="form-label">First Name</label>
<input
type="text"
placeholder="Enter your first name here"
class="form-control"
(input)="handleUserInput($event)"
aria-describedby="basic-addon3"
/>
<small class="text-success" *ngIf="nameFound">Name Found</small>
<small class="text-danger" *ngIf="firstName && !nameFound"
>Name Not Found</small
>
</div>
<div class="mt-4">
<label class="form-label">Last Name</label>
<input
type="text"
placeholder="Enter your last name here"
class="form-control"
(input)="handleUserInput($event)"
aria-describedby="basic-addon3"
/>
</div>
<div class="mt-4">
<button class="bg-primary border border-primary text-white w-50 p-1">
Submit
</button>
</div>
</form>
</div>
</section>
When we run the above code, we’ll see a basic form in our browser. This is the template we’ll use throughout this article.
In this part, we attached an input
event listener to the firstName
and lastName
fields. We also added a success text that shows up if a condition is satisfied.
Enter this code in your event-binding.component.ts
file:
import { Component } from "@angular/core";
@Component({
selector: "app-event-binding",
templateUrl: "./event-binding.component.html",
styleUrls: ["./event-binding.component.css"],
})
export class EventBindingComponent {
firstName: string = "";
lastName: string = "";
nameFound!: boolean;
public firstNames = ["Chioma", "Fola", "Ahmed", "Yunussa", "Ugo", "Amaka"];
ngOnInit(): void {}
handleUserInput(event: any) {
this.firstName = event.target.value;
console.log("First name: ", this.firstName);
this.nameFound = this.firstNames.some(
(firstName) => firstName.toLowerCase() === this.firstName,
);
console.log(this.nameFound);
if (this.nameFound) {
console.log("First name was found!!");
}
}
}
We defined an array of names so that when a user enters a value in the firstName
field, the input
event listener listens for changes to the value and then uses the value to check through the array to see if it matches any of the names in the array. If we find a match, that is, if the value entered matches any of the names in the array, a success text is displayed; if not, we show a failure text.
Here is a demo showing what we’ve covered in this section.
Reacting to Element Focus Loss using Blur Event Binding
The blur
event listener listens for when the focus on an element is lost. Using filling out a form as an example, the blur
event listener pays attention to when your cursor is moved outside your input field. This event listener is used especially to provide feedback to a user when filling out a form. It is used to apply CSS styles to an element when it loses focus, fetch data, and save data automatically.
For example, we can use the blur
event listener to check for the maximum number of characters we want our password to have, and if it exceeds, we give a warning feedback to the user.
Let’s add this password
input field to our existing template.
<div class="mt-4">
<label class="form-label">Password</label>
<input
type="password"
(blur)="handlePasswordLength($event)"
placeholder="Enter your password here"
class="form-control"
aria-describedby="basic-addon3"
/>
<small *ngIf="passwordErrorMsg">{{ passwordErrorMsg }}</small>
</div>
In your existing component file, add the following code to your variable definition section:
passwordErrorMsg!: string;
maxPasswordLength: number = 8;
Here, we define the passwordErrorMsg
string to display an error message, if any. We also define a variable maxPasswordLength
to hold the maximum password length as a number and set it to 8
.
Also, add the following function to your component file:
handlePasswordLength(event: any): void {
const userPassword = event.target.value;
this.passwordErrorMsg =
userPassword.length > this.maxPasswordLength
? `Your password is more than the maximum length of ${this.maxPasswordLength} characters`
: 'Approved password length';
}
After a user enters their password and clicks outside of the password input field, the blur
event listener listens for the password inputted by the user and then calls the handlePasswordLength
function. This function checks if the password length exceeds the value set in maxPasswordLength
. If it exceeds, it will throw a warning text that says the password is longer than the required length.
Here is a demo showing one of the numerous actions the blur
event listener plays.
Note that the warning message can also pop up as a dialog box.
Listening for Changes Effectively with the Change Event Binding
The change
event listener detects changes to an element value, such as the text, radio button, checkbox, and file input elements. It updates content only after an element loses focus or a change has been made. This is important because it helps process data or values entered by a user immediately and makes the user interface respond directly to user input changes.
In the following example, we’ll see how we can use the change
event listener to update a preview of Markdown content.
In your event-binding.component.html
file, enter the code below:
<form action="">
<div class="mt-2">
<h4>Markdown Editor</h4>
<textarea
(change)="updateMrkDwnPreview($event)"
placeholder="Enter markdown content here"
rows="5"
cols="40"
></textarea>
</div>
<div class="mt-3">
<h5>Preview Markdown Content</h5>
<div>
{{ markDownContent ? markDownContent : "You have no content yet" }}
</div>
</div>
</form>
Here we show a textarea
and a preview section of the content entered by a user in the textarea
.
In your event-binding.component.ts
file, enter the code below:
// add the code below to the variable definition section
markDownContent: string = '';
updateMrkDwnPreview(event: any) {
this.markDownContent = event.target.value;
console.log(this.markDownContent);
}
The markDownContent
variable holds the markdown content. The function updateMrkDwnPreview
updates the Markdown preview whenever a user enters a value in the textarea
and clicks outside the input field, as seen in the demo below.
Triggering Actions on User Clicks with Angular’s Click Event Binding
The click
event listener is interesting because it enables an action to take place with just a click. So, for example, while going through a website and you navigate to a page, that action is triggered by a click
event. You should note that any element is clickable.
A click
event listener is necessary as it is used for several actions, such as interacting with web elements, navigation, and form submission.
Let’s take an example of the click
event listener in action. In this example, when we click on a like, comment, or retweet icon, it increases its count
.
In your event-binding.component.html
file, enter the code below:
<section class="border border-primary d-flex justify-content-between">
<div class="cursor-pointer">
<i
class="fas fa-heart fs-2 text-danger icon"
(click)="handleCount('like')"
></i>
<p class="text-center">{{ likeCount }}</p>
</div>
<div>
<i
class="far fa-comment fs-2 text-danger icon"
(click)="handleCount('comment')"
></i>
<p class="text-center">{{ commentCount }}</p>
</div>
<div>
<i
class="fas fa-retweet fs-2 text-danger icon"
(click)="handleCount(retweet)"
></i>
<p class="text-center">{{ retweetCount }}</p>
</div>
</section>
In your event-binding.component.ts
file, enter the code below:
// add these first three lines of code to the variable definition section
likeCount: number = 0;
commentCount: number = 0;
retweetCount: number = 0;
handleCount(action: string) {
switch (action) {
case 'like':
this.likeCount = this.likeCount + 1;
break;
case 'comment':
this.commentCount = this.commentCount + 1;
break;
case 'retweet':
this.retweetCount = this.retweetCount + 1;
break;
default:
break;
}
}
First, we define the icon count
variables and set it to a default value of 0
. Then, we define the handleCount
function, triggered whenever icons are clicked. The function takes a string
parameter action
indicating the type of icon that was clicked (‘like’, ‘comment’, or ‘retweet’) before increasing the count
of the respective icon.
Here is a demo that shows what we’ve achieved in this section.
Capturing Form Submissions with Angular’s Submit Event Binding
The submit
event binder is used to handle form submission events. So, whenever a form is submitted, it triggers the submit
event binder, which in turn calls the function to send all form data to a server. The submit
event handler helps to validate a user’s input before submitting, and this includes preventing incorrect or incomplete data from being sent to a server.
Let’s see an example where the submit
event handler can be used.
Add the following code to the form
element in your existing event-binding.component.html
file:
(submit)="handleFormSubmit()"
Add the following code to your existing event-binding.component.ts
file:
handleFormSubmit() {
this.formData = {
firstName: this.firstName,
lastName: this.lastName,
password: this.password
}
console.log('Data submitted: ', this.formData)
}
When called, the handleFormSubmit
function collects the values of firstName
, lastName
, and password
and logs them to your console. You can also include code in the function to send the formData
to an endpoint.
Here is a demo.
Conclusion
We’ve reviewed five essential event binders that can be used in Angular to listen to click events, capture input changes, validate form submissions, react to element focus loss, or detect changes in form fields.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.