3

我正在尝试在 Angular 2 中实现日期范围选择器。

我已经有一个可以工作的小部件,我必须将它链接到@angular/forms子系统。

我想要的是能够将两个输出值(比如说rangeStartrangeEnd)绑定到包含表单状态的两个不同的属性。

有没有办法可以配置 NgModel 设置来完成这个?

另一种方法是绑定 DateRange 类型的单个属性:

type DateRange = {
    from: Date,
    to: Date
};

我不知道这是否可能。

关于如何做到这一点的任何建议?

编辑:

我拥有的是一个 jQuery 派生的 JS 组件,它公开了一个 onChange,如下所示:

component.on('change', (eventData) => {
  // here I have eventData.from and eventData.to as Date values
});

我想将这种处理程序集成到一个 Angular 友好的组件中。但是,我不能简单地这样做:

<my-date-range-picker name"xyz" [(NgModel)]="aDateRangeValue"></my-date-range-picker>

因为,AFAICT,变化检测不适用于复合值。我应该在我的组件中公开什么?两个EventEmitters? 我可以NgModel以某种方式利用吗?

4

3 回答 3

2

如果你想创建你自己ngModel的双向数据绑定,这就是你应该做的:

@Component()
export class MyComponent {

      myValue = 0;

      @Output()
      myValueChange = new EventEmitter();

      @Input()
      get myValue() {
             return this.myValue;
      }

      set myValue(val) {
           this.myValue= val;
           this.myValueChange.emit(this.myValue);
      }
}

现在您可以按如下方式使用它,并具有有效的双向数据绑定:

<my-component [(myValue)]="someExpression"></my-component>

还添加了一个简单教程的链接:http ://www.angulartraining.com/blog/tutorial-create-your-own-two-way-data-binding-in-angular/

于 2017-08-04T23:29:02.940 回答
1

您可以使用两个Output指令。

<my-date-range-picker name"xyz" [dateTo]="dateTo" [dateFrom]="dateFrom"></my-date-range-picker>

在您的组件中,您将拥有

import { Output } from '@angular/core';
.
.
@Output() dateTo: any; // EventEmitter, Subject, Number, String, doesn't matter ...
@Output() dateFrom: any;

Input这是使用和的组件交互的参考Output

组件交互

于 2017-08-03T14:45:13.653 回答
1

好吧,事实证明,您可以拥有任何类型的模型。

因此,我使用了本文中的基类,这是最相关的:

export class ValueAccessorBase<T> implements ControlValueAccessor {  
  private innerValue: T;


  private changed = new Array<(value: T) => void>();
  private touched = new Array<() => void>();


  get value(): T {
    return this.innerValue;
  }


  set value(value: T) {
    if (this.innerValue !== value) {
      this.innerValue = value;
      this.changed.forEach(f => f(value));
    }
  }


  touch() {
    this.touched.forEach(f => f());
  }


  writeValue(value: T) {
    this.innerValue = value;
  }


  registerOnChange(fn: (value: T) => void) {
    this.changed.push(fn);
  }


  registerOnTouched(fn: () => void) {
    this.touched.push(fn);
  }
}

在我的情况下,即使T是一个具有fromto属性的类,这也会发生:

@Component(
  ...
)
class DateRangeComponent extends ValueAccessorBase<DateRange> {
  ... implementation

  // somewhere after the view init:
  jqueryComponent.on('change', (eventData) => {
   // here I have eventData.from and eventData.to as Date values
   this.value = {
     from: eventData.from,
     to: eventData.to
   };
  });
}

因此,如果其他人都偶然发现了这个问题,答案是:继续编写自己的组件。

附带说明一下,这在仅使用表单来准备要在 Ajax 调用中发送的 Json 对象时效果最佳。老式的表单编码提交将不那么线性。

于 2018-02-14T09:40:57.543 回答