.l-main-section p. Use the event syntax (eventName) to make your application respond to user input. p. You can specify the event handler—a method in the component controller—like this: pre.prettyprint.lang-html code. <input (keyup)="myControllerMethod()"> p. As in previous examples, you can make element references available to other parts of the template as a local variable using the # syntax. Using # and events, you can write the old "update text as you type" example: pre.prettyprint.lang-html code. <input #myname (keyup)> <p>{{myname.value}}</p> p.text-body(ng-non-bindable). In that example, #myname creates a local variable in the template that the <p> element can refer to. The (keyup) tells Angular to trigger updates when it gets a keyup event. And {{myname.value}} binds the text node of the <p> element to the input's value property. p. Let's do something a little more complex, where the user enters items that the app adds to a list: figure.image-display img(src='user-input-example1.png') .l-main-section h2#section-create-an-array-property Create a list property p. With the default files in place, create a TodoController class to manage interactions with the list. Inside TodoController, add a list with some initial items. Then add a method that adds new items to the list. pre.prettyprint.lang-dart code. class TodoList { List<String> todos = ['Eat breakfast', 'Walk dog', 'Breathe', 'Learn Angular']; addTodo(String todo) { todos.add(todo); } } .callout.is-helpful header Production Best Practice p. As shown in the previous example, a production application you would separate the model out into another class and inject it into TodoController. We've omitted that here for brevity.

.l-main-section h2#section-display-the-list-of-todos Display the list of todos p. Using the *for iterator, create an <li> for each item in the todos list and set its text to the value. pre.prettyprint.lang-html code. <ul> <li *for="#todo of todos"> {{ todo }} </li> </ul> .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 #varname. Call it #todotext here. pre.prettyprint.lang-html code. <input #todotext> p. Specify the target of the click event binding as your controller's addTodo() method and pass it the value. Since you created a reference called todotext, you can get the value with todotext.value. pre.prettyprint.lang-html code. <button (click)="addTodo(todotext.value)">Add Todo</button> p. To make pressing Enter do something useful, you can add a keyup event handler to the input field. This event handler uses APIs defined in dart:html, so be sure to import that library. .code-box pre.prettyprint.lang-dart(data-name="todo_list.dart") code. // In the template: <input #todotext (keyup)="doneTyping(\$event)"> // In the component controller class: doneTyping(KeyboardEvent event) { if (event.keyCode == KeyCode.ENTER) { InputElement e = event.target; addTodo(e.value); e.value = null; } } pre.prettyprint.lang-dart(data-name="main.dart") code. library user_input; import 'dart:html'; ... .l-main-section h2#section-final-code Final code .code-box pre.prettyprint.lang-dart(data-name="todo_list.dart") code. // web/todo_list.dart part of user_input; @Component( selector: 'todo-list' ) @View( // Without r before ''' (a raw string), $event breaks Angular. // An alternative to a raw string is to use \$event instead. template: r''' <ul> <li *for="#todo of todos"> {{ todo }} </li> </ul> <input #todotext (keyup)="doneTyping($event)"> <button (click)="addTodo(todotext.value)">Add Todo</button> ''', directives: const[For] ) class TodoList { List<String> todos = ['Eat breakfast', 'Walk dog', 'Breathe', 'Learn Angular']; addTodo(String todo) { todos.add(todo); } doneTyping(KeyboardEvent event) { if (event.keyCode == KeyCode.ENTER) { InputElement e = event.target; addTodo(e.value); e.value = null; } } } pre.prettyprint.lang-dart(data-name="main.dart") code. // web/main.dart library user_input; import 'dart:html'; import 'package:angular2/angular2.dart'; import 'package:angular2/src/reflection/reflection.dart' show reflector; import 'package:angular2/src/reflection/reflection_capabilities.dart' show ReflectionCapabilities; part 'todo_list.dart'; main() { reflector.reflectionCapabilities = new ReflectionCapabilities(); bootstrap(TodoList); } pre.prettyprint.lang-html(data-name="html") code. <!-- web/index.html --> <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="style.css"> </head> <body> <todo-list></todo-list> <script type="application/dart" src="main.dart"></script> <script src="packages/browser/dart.js"></script> </body> </html> pre.prettyprint.lang-yaml(data-name="yaml") code. # pubspec.yaml name: user_input description: Dart version of Angular 2 example, Responding to User Input version: 0.0.1 dependencies: angular2: 2.0.0-alpha.20 browser: any