2016-05-23 15 views
7

次のようなdatetime pickerディレクティブを作成しようとしています。
<input [(ngModel)]="date1" datetime-picker date-only />angular2アクセスngModelディレクティブの変数

date1日として割り当てられているに、例えば、私はHTMLでこれを表示するとnew Date()

、入力要素のテキストが、私は次のように表示したい以下の
Thu Jan 01 2015 00:00:00 GMT-0500

のように見えます次の代わりに
2015-01-01 00:00:00

広告内に日付をフォーマットしたいデフォルトのtoString()関数の結果を表示するのではなく、DatePipeを使用してディレクティブを使用します。

私の質問は、 "ディレクティブ内で、変数ngModelにアクセスするにはどうすればいいですか?"(例:date1)、toString()メソッドを追加できます。

私のアプローチが正しくない場合は、私に助言してください。

+0

あなたのパイプの 'transform'関数にモデル値を渡しませんか? –

答えて

12

ngModelにアクセスするには、に@Input()と入力するだけです。また、双方向データバインディングを使用しているので、変更をngModelに発行する必要があります。


より良い方法の私見

Check this plunk

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

    ngOnInit(){ 
    this.ngModelChange.emit(this.ngModel.toDateString()); 
    } 
} 
、耳を傾け、ngModelに通知するためにここで 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

このソリューションは日付を形式で表示するのに適しています。ただし、ngModelのメソッドtoStringは実際に日付の書式設定を変更しません。これは実際にngModelを 'Date'から' string'に変更します。これは意図していません。 @Abdulrahman、toStringを変更して新しいngModelを発行する必要がありますか? – allenhwkim

+0

@allenhwkim私は、 'toString()'メソッドをオーバーライドしたいと思っていますか?もしそうなら、 'ngModel'ではなく' Date'のメソッドをオーバーライドする必要があります。 – Abdulrahman

+0

いいえ、私は 'Date.toString'をオーバーライドしたくありません。私はngModelであるDateインスタンスの 'toString'メソッドをオーバーライドしたいと思います。 – allenhwkim

11

され、シンプルで簡単な方法を使用しています。簡単な理解のためjQueryでデモンストレーションしました。実際には、何でもかまいません。

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

ありがとうございます。このソリューションはうまくいきました。 –

+0

@Dhrumil Bhankar、なぜ $(that.element.nativeElement).bind( "customEvent" 機能(someNewValue){ that.ngModel.update.emit(someNewValue); }})。私のコードで解雇されていません –

+0

@gentosこれは一般的な例であることに注意してください。実際のコードではありません。ここでは、 "customElement"は任意のイベントです。 Clickでモデルを更新したい場合は、その "customEvent"の代わりに "click"を使用する必要があります。 –

関連する問題