【问题标题】:Two way data binding for object between components组件间对象的双向数据绑定
【发布时间】:2016-06-30 12:44:39
【问题描述】:

我有带输入的组件:

<my-input *ngIf='filter.type === checkType.INPUT_TEXT' [filter]='filter'></my-input>

export class MyInputComponent{
  @Input() filter: any;
}

MyInputComponent 的模板

<input name="name" [(ngModel)]="filter.input">

我想在内部设置过滤器输入并对外部 Component 对象产生影响。

如何将过滤器对象传入MyInputComponent,实现2路数据绑定?

我想实现类似 [(ngModel)]="filter.value" 但在组件之间工作

这里有关 2-way 数据绑定的其他帖子没有回答我的问题。

编辑:

在我的 MyInputComponent 中使用 extends DefaultValueAccessor 后,我的父组件输入消失,没有任何错误。

import { Component, Input, OnInit, Provider, forwardRef } from '@angular/core';
import { FORM_DIRECTIVES, NG_VALUE_ACCESSOR, DefaultValueAccessor } from '@angular/common';

@Component({
  moduleId: module.id,
  selector: 'my-input',
  directives: [FORM_DIRECTIVES],
  host: { '(keyup)': 'doOnChange($event.target)' },
  templateUrl: '<input name="name" [(ngModel)]="filter.input">'
})

export class MyInputComponent extends DefaultValueAccessor {
  @Input() filter: any;

  onChange = (_) => {};
  onTouched = () => {};

  writeValue(filter:any):void {
    if (filter !== null) {
      super.writeValue(filter.toString());
    }
  }
  doOnChange(filter) {
    this.onChange(filter);
  }
}

const MY_VALUE_ACCESSOR = new Provider(
  NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => MyInputComponent), multi: true});

【问题讨论】:

标签: angular angular2-components


【解决方案1】:

您需要为此实现自定义值访问器。这是一个示例:

const MY_VALUE_ACCESSOR = new Provider(
  NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => MyInputComponent), multi: true});

@Component({
  (...)
  providers: [ MY_VALUE_ACCESSOR ]
})
export class MyInputComponent extends DefaultValueAccessor {
  onChange = (_) => {};
  onTouched = () => {};

  writeValue(value:any):void {
    if (value!=null) {
      super.writeValue(value.toString());
    }
  }

  // call when your internal input is updated
  doOnChange(val) {
    this.onChange(val);
  }
}

更多详情请看这篇文章(“NgModel兼容组件”一节):

另请参阅此问题:

【讨论】:

  • 我会检查它,我的经验很低,这是设置像这样传递的对象的值字段的最佳方法还是更好的是从层次结构中的所有组件中取出并通过传递来设置它index 和 value by method 更好的做法,或者有没有其他方法可以设置这个值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2019-02-28
相关资源
最近更新 更多