204 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.8 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" format="linenums").
 | 
						|
    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>*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" format="linenums").
 | 
						|
    <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 <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-tabs
 | 
						|
    code-pane(language="dart" name="todo_list.dart" format="linenums").
 | 
						|
      // 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;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    code-pane(language="dart" name="main.dart" format="linenums").
 | 
						|
      library user_input;
 | 
						|
 | 
						|
      import 'dart:html';
 | 
						|
      ...
 | 
						|
 | 
						|
.l-main-section
 | 
						|
  h2#section-final-code Final code
 | 
						|
 | 
						|
  code-tabs
 | 
						|
    code-pane(language="dart" name="todo_list.dart" format="linenums").
 | 
						|
      // 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;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    code-pane(language="dart" name="main.dart" format="linenums").
 | 
						|
      // 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);
 | 
						|
      }
 | 
						|
    code-pane(language="html" name="index.html" format="linenums").
 | 
						|
      <!-- 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>
 | 
						|
    code-pane(language="yaml" name="pubspec.yaml" format="linenums").
 | 
						|
      # 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.23
 | 
						|
        browser: any
 |