Получение даты, отформатированной и напечатанной на экране в приложении Angular 2

Я пытаюсь получить канал даты, который я использую в своем приложении Angular, чтобы правильно проанализировать его при использовании в шаблоне во входных данных. Первоначально, до форматирования даты, код выглядел так:

<input class="app-input" [readonly]="!hasAdminAccess"                                  
    [(ngModel)]="staff.profile.hireDate" placeholder="None"
    [field-status]="getPropertyStatus('profile.hireDate')"/>

Самое близкое, что я получил к трубе даты, это:

<input class="app-input"
{{ staff.profile.hireDate | date:'shortDate' }} placeholder="None"
[field-status]="getPropertyStatus('profile.hireDate')"/>

Но что это выводит на печать, так это (буквально это):

> <input class="app-input" 3/18/2014 placeholder="None"
> [field-status]="getPropertyStatus('profile.hireDate')"/>

Теперь вы заметите, что дата правильно отформатирована (и преобразование даты происходит успешно, чтобы сделать это так:

3/18/2014

Впрочем, остальное я не хочу (очевидно). Как я могу переработать синтаксис здесь, чтобы получить только дату для печати? Я уставился на него и попробовал несколько настроек, но пока не смог заставить его работать.

1 ответ

Вы можете использовать функции get и set в машинописи и ngModelChanged свойство для изменения ngModel после того, как это было установлено.

Компонент шаблона:

<input class="app-input" [(ngModel)]="hireDate" (ngModelChange)="dateChanged($event)"/>

Класс компонента:

import { Component } from '@angular/core';
import { DatePipe } from '@angular/common';

@Component({
  selector: 'my-app',
  template: `
    <div>
      <button (click)="setDate()">Set Date</button>
      <input class="app-input" readonly="true" [(ngModel)]="hireDate" (ngModelChange)="dateChanged($event)" placeholder="None"/>
    </div> 
  `,
})
export class App {
  name:string;
  staff: any;
  myDate: any;
  private _hireDate;

  dateChanged(value) {
    this.hireDate = this.datePipe.transform(value, 'shortDate');
  }

  set hireDate(value) {
    this._hireDate = this.datePipe.transform(value, 'shortDate');
  }

  get hireDate() {
    return this._hireDate;
  }

  setDate() {
    this.hireDate = '10-03-1993';
  }

  constructor(private datePipe: DatePipe) {
  }
}

Значение ввода будет устанавливаться при каждом изменении ввода, поэтому это может вызвать проблему с UX, так как пользователь не сможет ввести предпочитаемую дату. Обходной путь должен вызывать функцию изменения даты всякий раз, когда пользователь вводит свою дату. (Например, с помощью нажатия кнопки).

Я считаю, что функции set и get работают только для переменных класса, в вашем случае у вас есть свойство объекта. Изменение установленной функции, как показано ниже, будет работать.

  set hireDate(value) {
    this._hireDate = this.datePipe.transform(value, 'shortDate');
    this.staff.profile.hireDate = this._hireDate;
  }

Я также добавил сюда plunkr.

Другие вопросы по тегам