Я хотел бы создать директиву, которая может мутировать значения, передаваемые на вход и связанные с ним, связанные с ngModel.Angular 2 ngModel mutator директива
Скажем, я хотел сделать мутацию даты, каждый раз, когда модель изменяется, мутатор сначала получает значение для правильного формата (например, «2017-05-03 00:00:00» отображается как «2017/05/03 "), прежде чем ngModel обновит представление. Когда представление изменяется, мутатор получает изменение значения перед обновлением модели ngModel (например, ввод «2017/08/03» устанавливает модель в «2017-08-03 00:00:00» [timestamp]).
директива будет использоваться, как это:
<input [(ngModel)]="someModel" mutate="date:YYYY/MM/DD" />
Мой первый инстинкт должен был получить ссылку на ControlValueAccessor и NgModel на компоненте хоста.
import { Directive, ElementRef, Input,
Host, OnChanges, Optional, Self, Inject } from '@angular/core';
import { NgModel, ControlValueAccessor,
NG_VALUE_ACCESSOR } from '@angular/forms';
@Directive({
selector: '[mutate]',
})
export class MutateDirective {
constructor(
@Host() private _ngModel: NgModel,
@Optional() @Self() @Inject(NG_VALUE_ACCESSOR)
private _controlValueAccessor: ControlValueAccessor[]
){
console.log('mutute construct', _controlValueAccessor);
}
}
Тогда я понял, что классы Angular 2 Forms сложны, и я понятия не имею, что я делаю. Есть идеи?
UPDATE
На основании ответа ниже я придумал решение: see gist
Использование (требуется Moment JS):
<input mutate="YYYY/MM/DD" inputFormat="YYYY-MM-DD HH:mm:ss" [(ngModel)]="someDate">
Спасибо за это. Это работает. Я надеялся не иметь дело с конкретным элементом ввода ('event.target.value'), чтобы он мог быть совместим с любым типом ввода, поддерживаемым ngModel. Возможно, захватив существующий по умолчанию ControlValueAccessor и завернув его до того, как он будет предоставлен NgModel. Основываясь на вашем коде, я придумал это для мутирования дат, [GIST] (https://gist.github.com/christiaan-lombard/31c5e3ccbd55f9ce523d64f9bf48b5f5) – christiaan
Вы не можете этого сделать. Если вы посмотрите на источники ng2, вы увидите, что они делают то же самое - у них просто есть набор атрибутов доступа для разных типов входов. –