anchor.diff:    But if the properties haven't changed &mdash; and most of the time they will not have changed &mdash;
     Angular can leave those DOM elements alone. The list UI will be smoother and more responsive.
   
  -  *追踪*函数不会排除所有DOM更改。
  -  如果用来判断是否同一个英雄的*属性*变化了，Angular就可能不得不更新DOM元素。
  +  *追踪*函数不会乐队所有 DOM 更改。
  +  如果同一个英雄的*属性*变化了，Angular 就可能不得不更新DOM元素。
     但是如果这个属性没有变化 —— 而且大多数时候它们不会变化 ——
  -  Angular就能留下这些DOM元素。列表界面就会更加平滑，提供更好的响应。
  +  Angular 就能留下这些 DOM 元素。列表界面就会更加平滑，提供更好的响应。
   
     Here is an illustration of the `NgForTrackBy` effect.
   
  -  这里是关于`NgForTrackBy`效果的一个插图。
  +  这里是关于`NgForTrackBy`效果的插图。
   figure.image-display
     img(src='/resources/images/devguide/template-syntax/ng-for-track-by-anim.gif' alt="NgForTrackBy")
   
  
positive.code:       p 双向
      td
        p Event and property
        p 事件与Property
      td
        +makeExample('template-syntax/ts/app/app.component.html', '2-way-binding-syntax-1')(format=".")
    tr
      td Attribute
      td
        p Attribute (the&nbsp;exception)
        p Attribute例外情况
      td
        +makeExample('template-syntax/ts/app/app.component.html', 'attribute-binding-syntax-1')(format=".")
    tr
      td
        p Class
        p CSS类
      td
        p <code>class</code> property
        p <code>class</code> property
  
negative.code:     The `ngModel` data property sets the element's value property and the `ngModelChange` event property
      listens for changes to the element's value.
  
      `ngModel`数据属性设置元素的 value 属性，`ngModelChange`事件属性监听元素 value 的变化。
  
      The details are specific to each kind of element and therefore the `NgModel` directive only works for specific form elements,
      such as the input text box, that are supported by a [ControlValueAccessor](../api/forms/index/ControlValueAccessor-interface.html).
  
      每种元素的特点各不相同，所以`NgModel`指令只能在一些特定表单元素上使用，例如输入文本框，因为它们支持 [ControlValueAccessor](../api/forms/index/ControlValueAccessor-interface.html)。
  
      We can't apply `[(ngModel)]` to a custom component until we write a suitable *value accessor*,
      a technique that is beyond the scope of this chapter.
      That's something we might want to do for an Angular component or a WebComponent whose API we can't control.
  
      除非写一个合适的*值访问器*，否则不能把`[(ngModel)]`用在自定义组件上。
      但*值访问器*技术超出了本章的范围。
      对于不能控制其 API 的 Angular 组件或者 Web 组件，可能需要为其添加 *value accessor*。
  
      It's completely unnecessary for an Angular component that we _do_ control ... because we can name the value and event properties
      to suit Angular's basic [two-way binding syntax](#two-way) and skip `NgModel` altogether.
  
      但是对于我们能控制的 Angular 组件来说，这么做就完全没有必要了。
      因为可以指定值和事件属性名字来进行基本的 Angular [双向绑定语法](#two-way)，完全不用`NgModel`。
  
  :marked
    Separate `ngModel` bindings is an improvement over binding to the element's native properties. We can do better.
  
    独立的`ngModel`绑定相比直接绑定元素的原生属性是个改进，但还能做得更好。
  
    We shouldn't have to mention the data property twice. Angular should be able to capture the component’s data property and set it
    with a single declaration &mdash; which it can with the `[(ngModel)]` syntax:
  
    我们不应该提及数据属性两次。Angular 应该能捕捉组件的数据属性，并用一条声明来设置它——依靠`[(ngModel)]`，可以这么做：
  +makeExample('template-syntax/ts/app/app.component.html', 'NgModel-1')(format=".")
  :marked
    Is `[(ngModel)]` all we need? Is there ever a reason to fall back to its expanded form?
  
    `[(ngModel)]`就是我们所需的一切吗？有没有什么理由需要回退到它的展开形式？
  
    The `[(ngModel)]` syntax can only _set_ a data-bound property.
    If we need to do something more or something different, we need to write the expanded form ourselves.
  
    `[(ngModel)]`语法只能_设置_一个数据绑定属性。
    如果需要做更多或不同的事情，就得自己用它的展开形式。
  
    Let's try something silly like forcing the input value to uppercase:
  
  