Understanding components
In the last section, we saw that Aurelia requires a component to mount as the root of our entire application and by default, it was the app component. Now let's explore this component.
A component is composed of two files, the first written in JavaScript that contains the component's view model and the second one is the markup template written in HTML. They must have the same filename to help the view model resolve its view template. The component's view model is a JavaScript file, which exports a class that contains the component's attributes and functions. For example, this is the content of the app.js component:
export class App {
constructor() {
this.message = 'Hello World!';
}
}
The App class declares a constructor that initializes the message property. Properties can be declared into the constructor or can be defined outside of it. Consider this example:
export class App {
message = 'Hello World!';
}
Use the outside property declaration style when you are declaring simple classes such as Plain Old CLR Objects (POCO), which now implements more logic than simply get and set its property values.
To use the properties defined in our app.js view model, we need an HTML template with the same filename. Open the app.html file to see its content:
<template>
<h1>${message}</h1>
</template>
The first thing to note is that the message property declared in the view model is present, but in order to bind the value, we have to use the ${} string interpolation operator. Finally, when Aurelia renders the component in the web page, the ${message} declaration will be replaced by 'Hello World!'.
We can extend our components by adding functions that can be called from the template. For example, let's declare the changeMessage() function:
export class App {
constructor() {
this.message = 'Hello World!';
}
changeMessage() {
this.message = 'World-Cup App';
}
}
From the preceding code, you can see how declaring a function is a simple; we use the same syntax of the contructor declaration. If you want to use the properties declared in the App class, you have to use the this reserved word to access any property or function.
Now it is time to invoke our changeMessage function. First, we will create a button in our template in the app.html file and declare a trigger to the click event of the button. Open the app.html file and apply the following changes:
<template>
<h1>${message}</h1>
<button click.trigger="changeMessage()">Change</button>
</template>
The first thing to note here is that we don't use the default HTML onclick event; instead, we use the click event with no on at the start of the event name. This convention is used only for the Aurelia templating engine. So, we say that we want to invoke the changeMessage() functions by binding this function to the click event using the trigger binding mechanism.
Launch your app by executing the au run command in your Terminal, and test this out. When you click on the Change button, you should see how the message is changed from 'Hello World!' to 'World-Cup' App. The h1 HTML element is changed because we have previously declared and bound the ${message} property into its content.
Binding is a big concept we will cover in next chapters in a more detailed way. So, keep reading my friend, it just starting.