web-dev-qa-db-fra.com

Est-il correct d'implémenter un NgbDateParserFormatter personnalisé pour changer le format de la valeur d'entrée sur NgbInputDatepicker?

J'utilise le datepicker ( ng-boostrap ) dans un popup et je voudrais changer le format de date en dd-mm-yyyy.

Il semble que cela puisse être résolu en implémentant un nouveau NgbDateParserFormatter pour remplacer le _ par défaut NgbDateISOParserFormatter.

Mais je me demandais s'il y avait un autre moyen.

UPDATE:

Une petite implémentation de NgbDateParserFormatter avec Moment.js (testé avec la version 1.0.0-alpha.14 de ng-bootstrap):

import {NgbDateParserFormatter, NgbDateStruct} from '@ng-bootstrap/ng-bootstrap';
import * as moment from 'moment';

export class NgbDateMomentParserFormatter extends NgbDateParserFormatter {
    constructor(private momentFormat: string) {
        super();
    };
    format(date: NgbDateStruct): string {
        if (date === null) {
            return '';
        }
        let d = moment({ year: date.year, 
                         month: date.month - 1, 
                         date: date.day });
        return d.isValid() ? d.format(this.momentFormat) : '';
    }

    parse(value: string): NgbDateStruct {
        if (!value) {
            return null;
        }
        let d = moment(value, this.momentFormat);
        return d.isValid() ? { year: d.year(), 
                               month: d.month() + 1, 
                               day: d.date() } : null;
    }
}

Et dans un module, vous incluez le fournisseur utilisant une fabrique pour indiquer le format de date en tant que paramètre:

---

@NgModule({

  ---

  providers: [
    { 
      provide: NgbDateParserFormatter, 
      useFactory: () => { return new NgbDateMomentParserFormatter("DD-MM-YYYY") } 
    }
  ]

  ---

})
47

À partir d’aujourd’hui, la meilleure solution consiste à mettre en œuvre une personnalisation NgbDateParserFormatter. Alors oui, c’est une manière correcte.

Dans le futur, nous aurons peut-être une implémentation plus sophistiquée de NgbDateParserFormatter où vous pourrez simplement passer le format souhaité (ex. yyyy-MM-dd). L'ajout de cette fonctionnalité dépendra de l'intérêt de l'utilisateur.

Vous pouvez également vérifier certaines informations de base dans https://github.com/ng-bootstrap/ng-bootstrap/issues/754#issuecomment-247767027

19

Créer un formateur d’analyseur personnalisé.

import { NgbDateParserFormatter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
import { Injectable } from '@angular/core';

@Injectable()
export class NgbDateCustomParserFormatter extends NgbDateParserFormatter {

  format(date: NgbDateStruct): string {
    return date ? `${isNumber(date.day) ? padNumber(date.day) : ''}-${isNumber(date.month) ? padNumber(date.month) : ''}-${date.year}` : '';
  }
}

Définissez le fournisseur pour le formateur de l’analyseur personnalisé dans le @NgModule.

providers: [
    {provide: NgbDateParserFormatter, useClass: NgbDateCustomParserFormatter}
]

Comme décrit dans le api

0
Asif vora