199 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| .l-main-section
 | |
|   p.
 | |
|     Use the event syntax <strong>(<em>eventName</em>)</strong> to
 | |
|     make your application respond to user input.
 | |
|   p.
 | |
|     You can specify the event handler—a method in the component controller—like this:
 | |
| 
 | |
|   code-example(language="html").
 | |
|     <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 <b>#</b> syntax.
 | |
|     Using <code>#</code> and events,
 | |
|     you can write the old "update text as you type" example:
 | |
|     <!-- PENDING: make sure we use recommended word separation scheme.
 | |
|     my-name doesn't work, but my_name does. Would myName work? -->
 | |
| 
 | |
|   code-example(language="html").
 | |
|     <input #myname (keyup)>
 | |
|     <p>{{myname.value}}</p>
 | |
| 
 | |
|   p.text-body(ng-non-bindable).
 | |
|     In that example, <code>#myname</code> creates a local variable in the template that
 | |
|     the <code><p></code> element can refer to.
 | |
|     The <code>(keyup)</code> tells Angular to trigger updates when it gets a keyup
 | |
|     event.  And <code>{{myname.value}}</code> binds the text node of the
 | |
|     <code><p></code> 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='/resources/images/examples/user-input-example1.png' alt="Example of Todo App")
 | |
| 
 | |
| 
 | |
| .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.
 | |
| 
 | |
|   code-example(language="dart").
 | |
|     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 <code>TodoController</code>.
 | |
|       We've omitted that here for brevity.
 | |
| 
 | |
| <br><br><!-- PENDING: fix formatting of main sections after callouts -->
 | |
| 
 | |
| .l-main-section
 | |
|   h2#section-display-the-list-of-todos Display the list of todos
 | |
|   p.
 | |
|     Using the <code>*ng-for</code> iterator, create an <code><li></code> for each item in the todos list and set
 | |
|     its text to the value.
 | |
| 
 | |
|   code-example(language="html").
 | |
|     <ul>
 | |
|        <li *ng-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 <code>#varname</code>.  Call it <code>#todotext</code> here.
 | |
| 
 | |
|   code-example(language="html").
 | |
|     <input #todotext>
 | |
|   p.
 | |
|     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 <code>todotext.value.</code>
 | |
| 
 | |
|   code-example(language="html").
 | |
|     <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
 | |
|     <a href="https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:html">dart:html</a>,
 | |
|     so be sure to import that library.
 | |
| 
 | |
|   code-example(language="dart").
 | |
|     import 'dart:html';
 | |
|     ...
 | |
| 
 | |
|     // 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;
 | |
|       }
 | |
|     }
 | |
| 
 | |
| .l-main-section
 | |
|   h2#section-final-code Final code
 | |
| 
 | |
|   code-tabs
 | |
|     code-pane(language="dart" name="lib/todo_list.dart" format="linenums").
 | |
|       library user_input.todo_list;
 | |
| 
 | |
|       import 'dart:html';
 | |
|       import 'package:angular2/angular2.dart';
 | |
| 
 | |
|       @Component(selector: 'todo-list')
 | |
|       @View(
 | |
|           // An alternative to using \$event is to use a raw string instead.
 | |
|           // For example, change "template: '''" to "template: r'''".
 | |
|           template: '''
 | |
|           <ul>
 | |
|             <li *ng-for="#todo of todos">
 | |
|               {{ todo }}
 | |
|             </li>
 | |
|           </ul>
 | |
| 
 | |
|           <input #todotext (keyup)="doneTyping(\$event)">
 | |
|           <button (click)="addTodo(todotext.value)">Add Todo</button>
 | |
|       ''', directives: const [NgFor])
 | |
|       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;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     code-pane(language="dart" name="web/main.dart" format="linenums").
 | |
|       import 'package:angular2/bootstrap.dart';
 | |
|       import 'package:user_input/todo_list.dart';
 | |
| 
 | |
|       main() {
 | |
|         bootstrap(TodoList);
 | |
|       }
 | |
|     code-pane(language="html" name="web/index.html" format="linenums").
 | |
|       <!DOCTYPE html>
 | |
|       <html>
 | |
|         <head>
 | |
|           <title>User Input</title>
 | |
|           <link rel="stylesheet" href="style.css">
 | |
|           <script async src="main.dart" type="application/dart"></script>
 | |
|           <script async src="packages/browser/dart.js"></script>
 | |
|         </head>
 | |
|         <body>
 | |
|           <todo-list></todo-list>
 | |
|         </body>
 | |
|       </html>
 | |
|     code-pane(language="yaml" name="pubspec.yaml" format="linenums").
 | |
|       name: user_input
 | |
|       description: User Input example
 | |
|       version: 0.0.1
 | |
|       dependencies:
 | |
|         angular2: 2.0.0-alpha.39
 | |
|         browser: ^0.10.0
 | |
|       transformers:
 | |
|       - angular2:
 | |
|           entry_points: web/main.dart
 |