2015-04-22 08:42:47 -04:00
.l-main-section
2015-04-22 09:03:21 -04:00
h2#section-responding-to-user-input Responding to user input with event syntax
2015-04-22 10:21:09 -04:00
2015-04-19 19:04:22 -04:00
p.
2015-04-22 09:03:21 -04:00
You can make your application respond to user input by using the event syntax. The event syntax starts with an event name surrounded by parenthesis: <code>(event)</code>. A controller function is then assigned to the event name: <code>(event)="controllerFn()"</code>.
2015-04-19 19:04:22 -04:00
p.
For a particular control like an input you can have it call methods on your controller on keyup event like so:
2015-05-19 09:33:09 -04:00
code-example(language="html").
<input (keyup)="myControllerMethod()">
2015-04-22 10:21:09 -04:00
2015-04-22 09:03:21 -04:00
h3#local-variables Local variables
2015-04-19 19:04:22 -04:00
p.
As in previous examples, you can make element references available to other parts of the template as a local
2015-04-22 08:25:15 -04:00
variable using the <code>#var</code> syntax. With this and events, we can do the old "update text as you type" example:
2015-04-19 19:04:22 -04:00
2015-05-19 09:33:09 -04:00
code-example(language="html").
<input #myname (keyup)>
<p>{{myname.value}}</p>
2015-04-19 19:04:22 -04:00
p.text-body(ng-non-bindable).
2015-04-22 08:25:15 -04:00
The <code>#myname</code> creates a local variable in the template that we'll refer to below in the
2015-04-19 19:04:22 -04:00
<code><p></code> element. The <code>(keyup)</code> tells Angular to trigger updates when it gets a keyup
2015-04-22 08:25:15 -04:00
event. And the <code>{{myname.value}}</code> binds the text node of the <code><p></code> element to the
2015-04-19 19:04:22 -04:00
input's value property.
p Let's do something a little more complex where users enter items and add them to a list like this:
2015-05-26 09:29:27 -04:00
2015-04-22 10:21:09 -04:00
figure.image-display
2015-05-26 09:29:27 -04:00
img(src='/resources/images/examples/user-input-example1.png' alt="Example of Todo App")
2015-04-19 18:12:29 -04:00
2015-04-22 08:25:15 -04:00
.l-ain-section
2015-04-19 19:04:22 -04:00
h2#section-create-an-array-property Create an array property
p.
2015-04-22 08:25:15 -04:00
With the default bootstrapping in place, create a controller class that will manage interactions with the
list. Inside the controller, add an array with an initial list of items. Then add a method that pushes new items
2015-04-19 19:04:22 -04:00
on the array when called.
2015-05-19 09:33:09 -04:00
code-tabs
code-pane(language="javascript" name="TypeScript" format="linenums").
//TypeScript
class TodoList {
todos: Array<string>;
constructor() {
2015-04-19 18:12:29 -04:00
this.todos = ["Eat Breakfast", "Walk Dog", "Breathe"];
}
2015-05-19 09:33:09 -04:00
addTodo(todo: string) {
this.todos.push(todo);
2015-04-19 19:04:22 -04:00
}
2015-05-19 09:33:09 -04:00
}
code-pane(language="javascript" name="ES5" format="linenums").
//ES5
function TodoList() {
this.todos = ["Eat Breakfast", "Walk Dog", "Breathe"];
this.addTodo = function(todo) {
this.todos.push(todo);
};
}
2015-04-19 19:04:22 -04:00
.callout.is-helpful
header Production Best Practice
p.
As with the previous example, in a production application you will separate your model out into another class
2015-04-22 08:25:15 -04:00
and inject it into <code>TodoList</code>. We've omitted it here for brevity.
2015-04-19 19:04:22 -04:00
.l-main-section
h2#section-display-the-list-of-todos Display the list of todos
p.
2015-06-04 06:43:58 -04:00
Using the <code>*ng-for</code> iterator, create an <code><li></code> for each item in the todos array and set
2015-04-19 19:04:22 -04:00
its text to the value.
2015-05-19 09:33:09 -04:00
code-example(language="html" format="linenums").
<ul>
2015-06-04 06:43:58 -04:00
<li *ng-for="#todo of todos">
2015-05-19 09:33:09 -04:00
{{ todo }}
</li>
</ul>
2015-04-19 19:04:22 -04:00
.l-main-section
h2#section-add-todos-to-the-list Add todos to the list via button click
p.
Now, add a text input and a button for users to add items to the list. As you saw above, you can create a local
variable reference in your template with <code>#varname</code>. Call it <code>#todotext</code> here.
2015-05-19 09:33:09 -04:00
code-example(language="html" format="linenums").
<input #todotext>
2015-04-19 19:04:22 -04:00
p.
Lastly, specify the target of the click event binding as your controller's <code>addTodo()</code> method and pass
it the value. Since you created a reference called <code>todotext</code>, you can get the value with
2015-04-22 09:03:21 -04:00
<code>todotext.value.</code>
2015-04-19 19:04:22 -04:00
2015-05-19 09:33:09 -04:00
code-example(language="html" format="linenums").
<button (click)="addTodo(todotext.value)">Add Todo</button>
2015-04-19 19:04:22 -04:00
2015-04-22 08:25:15 -04:00
p And then create the <code>doneTyping()</code> method on TodoList and handle adding the todo text.
2015-04-19 19:04:22 -04:00
2015-05-19 09:33:09 -04:00
code-example(language="javascript" format="linenums").
doneTyping($event) {
if($event.which === 13) {
this.addTodo($event.target.value);
$event.target.value = null;
2015-04-19 19:04:22 -04:00
}
2015-05-19 09:33:09 -04:00
}
2015-04-19 19:04:22 -04:00
.l-main-section
h2#section-final-code Final Code
2015-05-19 09:33:09 -04:00
code-tabs
code-pane(language="javascript" name="TypeScript" format="linenums").
//TypeScript
2015-07-04 12:19:04 -04:00
import {Component, View, bootstrap, NgFor} from 'angular2/angular2';
2015-05-19 09:33:09 -04:00
@Component({
selector: 'todo-list'
})
@View({
template: `
<ul>
2015-07-04 12:19:04 -04:00
<li *ng-for="#todo of todos">
2015-05-19 09:33:09 -04:00
{{ todo }}
</li>
</ul>
<input #todotext (keyup)="doneTyping($event)">
<button (click)="addTodo(todotext.value)">Add Todo</button>
`,
2015-07-04 12:19:04 -04:00
directives: [NgFor]
2015-05-19 09:33:09 -04:00
})
class TodoList {
todos: Array<string>;
constructor() {
2015-04-22 10:21:09 -04:00
this.todos = ["Eat Breakfast", "Walk Dog", "Breathe"];
2015-05-19 09:33:09 -04:00
}
2015-04-22 10:21:09 -04:00
2015-05-19 09:33:09 -04:00
addTodo(todo: string) {
2015-07-10 02:40:02 -04:00
this.todos.push(todo.value);
2015-05-19 09:33:09 -04:00
}
2015-04-22 10:21:09 -04:00
2015-05-19 09:33:09 -04:00
doneTyping($event) {
if($event.which === 13) {
this.addTodo($event.target.value);
$event.target.value = null;
2015-04-19 18:12:29 -04:00
}
2015-04-19 19:04:22 -04:00
}
2015-05-19 09:33:09 -04:00
}
2015-04-19 19:04:22 -04:00
2015-05-19 09:33:09 -04:00
bootstrap(TodoList);
code-pane(language="javascript" name="ES5" format="linenums").
//ES5
function TodoList() {
this.todos = ["Eat Breakfast", "Walk Dog", "Breathe"];
2015-04-19 19:04:22 -04:00
2015-05-19 09:33:09 -04:00
this.addTodo = function(todo) {
2015-07-10 02:40:02 -04:00
this.todos.push(todo.value);
2015-05-19 09:33:09 -04:00
};
2015-04-19 19:04:22 -04:00
2015-05-19 09:33:09 -04:00
this.doneTyping = function($event) {
if($event.which === 13) {
this.addTodo($event.target.value);
$event.target.value = null;
2015-04-19 18:12:29 -04:00
}
}
2015-05-19 09:33:09 -04:00
}
TodoList.annotations = [
new angular.ComponentAnnotation({
selector: "todo-list"
}),
new angular.ViewAnnotation({
template:
'<ul>' +
2015-06-04 06:43:58 -04:00
'<li *ng-for="#todo of todos">' +
2015-05-19 09:33:09 -04:00
'{{ todo }}' +
'</li>' +
'</ul>' +
'<input #textbox (keyup)="doneTyping($event)">' +
'<button (click)="addTodo(textbox.value)">Add Todo</button>',
2015-07-04 12:19:04 -04:00
directives: [angular.NgFor]
2015-05-19 09:33:09 -04:00
})
];
2015-05-05 01:14:09 -04:00
2015-05-19 09:33:09 -04:00
document.addEventListener("DOMContentLoaded", function() {
angular.bootstrap(TodoList);
});
2015-04-19 19:04:22 -04:00