2016-05-23 28 views
7

Tôi đang cố gắng tạo chỉ thị bộ chọn giờ như sau.
<input [(ngModel)]="date1" datetime-picker date-only />angular2 truy cập biến ngModel từ chỉ thị

date1 được gán như một ngày, ví dụ, new Date()

Khi tôi hiển thị này trong html, văn bản trong yếu tố đầu vào trông giống như sau
Thu Jan 01 2015 00:00:00 GMT-0500

Tôi muốn hiển thị như thay vào đó, thay vào đó là
2015-01-01 00:00:00

Tôi muốn định dạng ngày WITHIN ad irion sử dụng DatePipe thay vì hiển thị kết quả từ hàm toString() mặc định.

Câu hỏi của tôi là; "trong chỉ thị, làm cách nào để truy cập biến ngModel?", ví dụ: date1, để tôi có thể thêm phương thức toString().

Nếu cách tiếp cận của tôi không đúng, hãy thông báo cho tôi.

+0

không angular truyền giá trị mô hình cho hàm 'transform' của đường ống? –

Trả lời

12

Để truy cập ngModel, bạn chỉ cần có một số @Input() trong số datetime-picker của mình. Và vì bạn đang sử dụng liên kết dữ liệu 2 chiều, bạn phải phát ra các thay đổi bạn thực hiện cho 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


Các tốt hơn theo cách IMHO, đang sử dụng 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

Giải pháp này là tốt để hiển thị ngày ở định dạng. Tuy nhiên, nó không thay đổi phương thức, 'toString', của một ngModel, mà thực sự thực hiện định dạng của một ngày tháng. Nó thực sự thay đổi một ngModel từ 'Date' thành' string', mà tôi không định làm. @Abdulrahman, chúng ta có cần phát ra một ngModel mới với toString được sửa đổi không? – allenhwkim

+0

@allenhwkim Tôi thấy, vì vậy bạn muốn ghi đè lên phương thức 'toString()'? Nếu vậy, bạn cần ghi đè phương thức 'Date' không phải' ngModel' – Abdulrahman

+0

Không, tôi không muốn ghi đè 'Date.toString'. Tôi muốn ghi đè phương thức 'toString' của một thể hiện Date, là một ngModel. – allenhwkim

11

Dưới đây là cách đơn giản và dễ dàng để lắng nghe và thông báo ngModel. Tôi vừa chứng minh với jQuery để dễ hiểu. Thực tế, nó có thể là bất cứ điều gì.

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

cảm ơn bạn, giải pháp này hoạt động tốt. –

+0

@Dhrumil Bhankar, lý do tại sao $ (that.element.nativeElement) .bind ("customEvent" function (someNewValue) { that.ngModel.update.emit (someNewValue); } }); không được kích hoạt trong mã của tôi –

+0

@gentos Xin lưu ý rằng đây là ví dụ chung. Không phải mã thực. Ở đây "customElement" có thể là bất kỳ sự kiện nào. Nếu bạn muốn mô hình cập nhật khi nhấp, bạn nên sử dụng "nhấp" thay vì từ "customEvent". –

Các vấn đề liên quan