2016-05-23 13 views
7

Ich versuche, eine Datetime-Picker-Direktive wie folgt zu erstellen.
<input [(ngModel)]="date1" datetime-picker date-only />angular2 Zugriff ngModel Variable von einer Direktive

und date1 wird als Datum zugewiesen, zum Beispiel new Date()

Wenn ich dies in HTML-Anzeige, Text in Eingabeelement sieht wie folgt aus
Thu Jan 01 2015 00:00:00 GMT-0500

Ich mag die angezeigt werden sollen statt
2015-01-01 00:00:00

Ich möchte Datum WITHIN ad formatieren Irective mit DatePipe anstelle von Ergebnis von Standard zu String() -Funktion anzuzeigen.

Meine Frage ist; "Wie kann ich innerhalb einer Direktive auf die ngModel-Variable zugreifen?", z. B. date1, so dass ich die Methode toString() hinzufügen kann.

Wenn mein Ansatz nicht richtig ist, bitte informieren Sie mich.

+0

übergibt nicht den Modellwert an Ihre Transformationsfunktion Ihrer Pfeife? –

Antwort

12

Für den Zugriff auf ngModel können Sie einfach eine @Input() in Ihrem datetime-picker haben. Und da Sie eine 2-Wege-Datenbindung verwenden, müssen Sie die vorgenommenen Änderungen an ngModel senden.

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

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

Check this plunk


Der bessere Weg IMHO, wird mit der 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

Diese Lösung ist gut, um das Datum im Format anzuzeigen. Es ändert jedoch keine Methode, toString, eines ngModel, das tatsächlich die Formatierung eines Datums ausführt. Es ändert tatsächlich ein ngModel von "Date" in "string", was ich nicht vorhabe. @Abdulrahman, müssen wir ein neues ngModel mit toString modifiziert ausgeben? – allenhwkim

+0

@allenhwkim Ich sehe, also wollen Sie die Methode 'toString()' überschreiben? Wenn dies der Fall ist, müssen Sie die Methode "Date" nicht "ngModel" überschreiben. – Abdulrahman

+0

Nein, ich möchte "Date.toString" nicht überschreiben. Ich möchte die toString-Methode einer Date-Instanz überschreiben, die ein ngModel ist. – allenhwkim

11

Hier ist einfache Art und Weise ngModel zu hören und informieren. Ich habe gerade mit jQuery zum besseren Verständnis demonstriert. Praktisch kann es alles sein.

import { Directive, ElementRef } from '@angular/core'; 
import { NgModel } from '@angular/forms'; 

@Directive({ 
    selector: `[ngModel][customDir]`, 
    providers: [NgModel] 
}) 
export class CustomDirective { 


    constructor(private element: ElementRef, private ngModel: NgModel) { 

    } 

    ngOnInit() { 
     let that = this; 
     /* Here you can write custom initialization code */ 

     /* Listening to the value of ngModel */ 
     that.ngModel.valueChanges.subscribe(function (value) { 
      /* Set any value of your custom control */ 
      $(that.element.nativeElement).data("newValue",value); 
     }); 

     /* Inform ng model for any new change happened */ 
     $(that.element.nativeElement).bind("customEvent",function (someNewValue) { 
       that.ngModel.update.emit(someNewValue); 
      } 
     }); 
    } 
} 
+0

danke, diese Lösung hat gut funktioniert. –

+0

@Dhrumil Bhankar, warum $ (that.element.nativeElement) .bind ("customEvent", Funktion (someNewValue) { that.ngModel.update.emit (someNewValue); } }); ist nicht in meinem Code gefeuert –

+0

@gentos Bitte beachten Sie, dass dies ein generisches Beispiel ist. Kein tatsächlicher Code. Hier kann "customElement" ein beliebiges Ereignis sein. Wenn Sie möchten, dass das Modell bei einem Klick aktualisiert wird, sollten Sie statt des Wortes "customEvent" "click" verwenden. –

Verwandte Themen