anchor.diff:    Angular表单接受指令在验证流程中的作用，因为指令注册自己到`NG_VALIDATORS`提供商中，该提供商拥有可扩展的验证指令集。
   
   +makeExample('cb-form-validation/ts/src/app/shared/forbidden-name.directive.ts','directive-providers', 'shared/forbidden-name.directive.ts (providers)')(format='.')
  +
   :marked
     Here is the rest of the directive to help you get an idea of how it all comes together:
     
  
positive.code:     correspond _exactly_ to the hero data object properties.
  
      本例非常“幸运”，因为`heroForm.value`属性**正好**与英雄数据对象属性对应。
  :marked
    The `addHero()` method discards pending changes and creates a brand new `hero` model object.
  
    `addHero()`方法放弃未处理的变化，并创建一个崭新的`hero`模型对象。
  +makeExample('cb-form-validation/ts/src/app/reactive/hero-form-reactive.component.ts','add-hero')(format='.')
  :marked
    Then it calls `buildForm()` again which replaces the previous `heroForm` control model with a new one.
    The `<form>` tag's `[formGroup]` binding refreshes the page with the new control model.
  
negative.code:   * The messages are static strings, hard-coded into the template.
    It's easier to maintain _dynamic_ messages in the component class.
    
      这些消息是静态的字符串，被硬编码到模板中。把这些动态消息放在代码中会更易于维护。
  
    In this example, you can move the logic and the messages into the component with a few changes to
    the template and component.
  