2016-05-23 12 views
7

Próbuję zbudować dyrektywy wyboru pliku datetime, jak poniżej.
<input [(ngModel)]="date1" datetime-picker date-only />dostęp kątowy2 Zmienna modelModel z dyrektywy

i date1 jest przypisany jako data, np new Date()

Kiedy wyświetli to w HTML, tekst w elemencie wejściowego wygląda następującym
Thu Jan 01 2015 00:00:00 GMT-0500

chcę wyświetlić jakby zamiast tego należy wpisać
2015-01-01 00:00:00

Chcę sformatować datę W reklamie z użyciem DatePipe zamiast wyświetlać wynik z domyślnej funkcji toString().

Moje pytanie brzmi; "w ramach dyrektywy, jak uzyskać dostęp do zmiennej ngModel?", np. date1, aby móc dodać metodę toString().

Jeśli moje podejście nie jest właściwe, proszę mi doradzić.

+0

nie przenosi wartości modelu do funkcji "transformacji" swojej rury? –

Odpowiedz

12

Aby uzyskać dostęp do ngModel, wystarczy po prostu mieć @Input() w swoim datetime-picker. A ponieważ używasz dwukierunkowego powiązania danych, musisz wyemitować zmiany wprowadzone do ngModel.

@Directive({ 
    selector:'[date-time-picker]' 
}) 
export class DateTimePicker{ 
    @Input() ngModel; 
    @Output() ngModelChange = new EventEmitter(); 

    ngOnInit(){ 
    this.ngModelChange.emit(this.ngModel.toDateString()); 
    } 
} 

Check this plunk


Lepszym sposobem IMHO, używa DatePipe

@Component({ 
    selector: 'my-app', 
    directives:[DateTimePicker], 
    template: ` 
     <input (ngModelChange)="myDate = $event" [ngModel]="myDate | date:'short'" datetime-picker /> 
    ` 
}) 
export class AppComponent { 
    myDate = new Date(); 
} 

Check this plunk

+0

To rozwiązanie dobrze jest wyświetlić datę w formacie. Jednak nie zmienia on metody 'toString' z ngModel, która faktycznie formatuje datę. To faktycznie zmienia ngModel z 'Date' na' string', którego nie zamierzam robić. @Abdulrahman, czy musimy wydać nowy NgModel z zmodyfikowanym toStringiem? – allenhwkim

+0

@allenhwkim Widzę, więc chcesz zastąpić metodę 'toString()'? Jeśli tak, to musisz zastąpić metodę 'Date' nie' ngModel' – Abdulrahman

+0

Nie, nie chcę przesłonić 'Date.toString'. Chcę zastąpić metodę 'toString' instancji Date, która jest ngModel. – allenhwkim

11

Tutaj jest prosty i łatwy sposób, aby słuchać i powiadomić ngModel. Właśnie pokazałem z jQuery dla łatwego zrozumienia. Praktycznie może to być cokolwiek.

+0

dziękuję, to rozwiązanie działało dobrze. –

+0

@Dhrumil Bhankar, dlaczego $ (that.element.nativeElement) .bind ("customEvent", function() {someNewValue that.ngModel.update.emit (someNewValue); } }); nie został zwolniony w moim kodzie –

+0

@gentos Zwróć uwagę, że jest to ogólny przykład. Nie rzeczywisty kod. Tutaj "customElement" może być dowolnym wydarzeniem. Jeśli chcesz, aby model aktualizował się po kliknięciu, zamiast słowa "customEvent" użyj "kliknij". –

Powiązane problemy