typescript - ngModel 自定义 ValuesAccessor

标签 typescript angular

关于 ngModel 和 DI 的高级问题。

正如我在这里看到的 = https://github.com/angular/angular/blob/2.0.0-beta.1/modules/angular2/src/common/forms/directives/ng_model.ts#L68 ngModel 等待提供者来自 NG_VALUE_ACCESSOR OpaqueToken。这意味着如果我想创建应该支持 ngModel 绑定(bind)的自定义组件,我应该将我对 ValueAccessor 的实现传递给 DI。所以我心里有两个问题。

1) 我该怎么做?

2) <input> 的默认 ValueAccessor 是什么?元素?如何让它继续工作并仅将我的用于自定义组件?

顺便说一句,正如我在这里看到的:https://github.com/angular/angular/blob/2.0.0-beta.1/modules/angular2/src/common/forms/directives/shared.ts#L102 defaultValueAccessor 是最后一个。所以这意味着如果我通过 DI 系统全局传递我的 ValueAccessor 而不是默认值,则永远不会返回。

最佳答案

您可以在相应指令的 providers(bindings 已弃用)属性中像这样注册自定义 ControlValueAccessor:

const CUSTOM_VALUE_ACCESSOR = CONST_EXPR(new Provider(
  NG_VALUE_ACCESSOR,
  {useExisting: forwardRef(() => TagsValueAccessor), multi: true}));

@Directive({
  selector: 'tags',
  host: {'(labelsChange)': 'onChange($event)'},
  providers: [CUSTOM_VALUE_ACCESSOR]
})
export class TagsValueAccessor implements ControlValueAccessor {
  (...)
}

然后,当您将使用 ngModel 和/或 ngFormControl 用于带有选择器 tags 的组件时,将自动选择此访问器:

@Component({
  (...)
  directives: [ TagsComponent, TagsValueAccessor ],
  template: `
    <tags [(ngModel)]="company.labels" 
          [ngFormControl]="companyForm.controls.labels"></tags>
  `
  })
  export class DetailsComponent {
    (...)
  }

此问题的完整示例可用:Angular 2 custom form input .

希望对你有帮助, 蒂埃里

关于typescript - ngModel 自定义 ValuesAccessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995938/

相关文章:

angular - 管道转换中的 promise

angular - 如何在angular2中以 react 形式存储多个复选框值?

angular - 检测关闭浏览器 Angular 12 的事件

typescript - Axios、Typescript 和 Promises

javascript - 设置扩展类基类值?

Typescript 联合类型 : Dealing with Interfaces

angular - rxjs observable.of(object) 返回 {"_isScalar": "", "value": {}, "scheduler": ""} 而不是值

javascript - 将(旋转的)ImageOverlay 内的 X 和 Y 坐标转换为纬度和经度

javascript - 使用 webpack 加载 node_modules

reactjs - 没有 Prop 时传递给 super 什么?