it-swarm.com.de

Ändern Sie das Format von md-datepicker in Winkelmaterial mit momentjs

Winkelmaterial führte eine neue Datumsauswahlkomponente ein, die hier gefunden wurde.

Ich möchte, dass das von dieser Komponente zurückgegebene Datum im Format yyy-mm-dd ist, aber ich bin nicht sicher, wie dies geschieht. Bei der Suche habe ich festgestellt, dass $mdDateLocaleProvider verwendet werden kann, aber ich konnte kein Beispiel für die Verwendung finden.

Kann mir jemand ein funktionierendes Beispiel für die Formatierung des von md-datepicker zurückgegebenen Datums zeigen?

56
dearn44

Es gibt eine Dokumentation für $mdDateLocaleProvider in den Angular-Materialdokumenten.

angular.module('app').config(function($mdDateLocaleProvider) {
    $mdDateLocaleProvider.formatDate = function(date) {
       return moment(date).format('YYYY-MM-DD');
    };
});

Wenn Sie moment.js nicht verwenden, ersetzen Sie den Code in formatDate durch den Code, den Sie zum Formatieren des Datums verwenden möchten.

Hier ist ein CodePen-Beispiel, das auf den Beispielen von Angular Material-Dokumenten basiert.

92

Um auch auf das von kazuar aufgezeigte Problem einzugehen:

Leider funktioniert es nicht, wenn das Datum über die Tastatur eingegeben wird

sie sollten auch die parseDate-Methode definieren. Aus den Dokumenten:

$mdDateLocaleProvider.parseDate = function(dateString) {
    var m = moment(dateString, 'L', true);
    return m.isValid() ? m.toDate() : new Date(NaN);
};

Für ein vollständiges Beispiel habe ich in meiner App (Moment verwenden):

$mdDateLocaleProvider.formatDate = function(date) {
    return moment(date).format('DD/MM/YYYY');
};

$mdDateLocaleProvider.parseDate = function(dateString) {
    var m = moment(dateString, 'DD/MM/YYYY', true);
    return m.isValid() ? m.toDate() : new Date(NaN);
};

Grüße

55
shulito

Für diejenigen, die Moment.js nicht verwenden, können Sie als Zeichenfolge formatieren:

.config(function($mdDateLocaleProvider) {
  $mdDateLocaleProvider.formatDate = function(date) {

    var day = date.getDate();
    var monthIndex = date.getMonth();
    var year = date.getFullYear();

    return day + '/' + (monthIndex + 1) + '/' + year;

  };
});
20
Ben Taliadoros

Funktionierte perfekt, wenn das Datum über die Tastatur eingegeben wurde und zur Initialisierung null zurückgegeben wurde, um die Massage "Ungültiges Datum" in der md-datepicker-Direktive zu vermeiden:

$mdDateLocaleProvider.formatDate = function(date) {
  return date ? moment(date).format('DD/MM/YYYY') : null;
};

$mdDateLocaleProvider.parseDate = function(dateString) {
  var m = moment(dateString, 'DD/MM/YYYY', true);
  return m.isValid() ? m.toDate() : new Date(NaN);
};
7
Janderson Silva

Das Ändern des Datumsformats, der Monats- und Wochennamen während der Laufzeit ist mit AngularJS 1.5.9 und Moment 2.17.1 problemlos möglich.

Konfigurieren Sie zuerst die Ausgangssprache. (In diesem Beispiel ist die Konfiguration von angle-translate/$ translateProvider optional.)

angular.module('app').config(configureLocalization)

configureLocalization.$inject = ['$translateProvider', '$mdDateLocaleProvider', 'localdb', '__config'];
function configureLocalization($translateProvider, $mdDateLocaleProvider, localdb, __config) {
  // Configure angular-translate
  $translateProvider.useStaticFilesLoader({
      prefix: 'locale/',
      suffix: '.json'
  });
  // get the language from local storage using a helper 
  var language = localdb.get('language');
  if (!language || language === 'undefined') {
    localdb.set('language', (language = __config.app.defaultLanguage));
  }
  // Set the preferredLanguage in angular-translate
  $translateProvider.preferredLanguage(language);

  // Change moment's locale so the 'L'-format is adjusted.
  // For example the 'L'-format is DD.MM.YYYY for German
  moment.locale(language);

  // Set month and week names for the general $mdDateLocale service
  var localeData = moment.localeData();
  $mdDateLocaleProvider.months      = localeData._months;
  $mdDateLocaleProvider.shortMonths = moment.monthsShort();
  $mdDateLocaleProvider.days        = localeData._weekdays;
  $mdDateLocaleProvider.shortDays   = localeData._weekdaysMin;
  // Optionaly let the week start on the day as defined by moment's locale data
  $mdDateLocaleProvider.firstDayOfWeek = localeData._week.dow;

  // Format and parse dates based on moment's 'L'-format
  // 'L'-format may later be changed
  $mdDateLocaleProvider.parseDate = function(dateString) {
    var m = moment(dateString, 'L', true);
    return m.isValid() ? m.toDate() : new Date(NaN);
  };

  $mdDateLocaleProvider.formatDate = function(date) {
    var m = moment(date);
    return m.isValid() ? m.format('L') : '';
  };
}

Später verfügen Sie möglicherweise über einen Basiscontroller, der eine Sprachvariable überwacht, die geändert wird, wenn der Benutzer eine andere Sprache wählt.

angular.module('app').controller('BaseCtrl', Base);

Base.$inject = ['$scope', '$translate', 'localdb', '$mdDateLocale'];
function Base($scope, $translate, localdb, $mdDateLocale) {

  var vm = this;
  vm.language = $translate.use();

  $scope.$watch('BaseCtrl.language', function(newValue, oldValue) {
    // Set the new language in local storage
    localdb.set('language', newValue);
    $translate.use(newValue);

    // Change moment's locale so the 'L'-format is adjusted.
    // For example the 'L'-format is DD-MM-YYYY for Dutch
    moment.locale(newValue);

    // Set month and week names for the general $mdDateLocale service
    var localeDate = moment.localeData();
    $mdDateLocale.months      = localeDate._months;
    $mdDateLocale.shortMonths = moment.monthsShort();
    $mdDateLocale.days        = localeDate._weekdays;
    $mdDateLocale.shortDays   = localeDate._weekdaysMin;
    // Optionaly let the week start on the day as defined by moment's locale data
    $mdDateLocale.firstDayOfWeek = localeData._week.dow;
  });
}

Beachten Sie, dass wir die $mdDateLocale.formatDate- und $mdDateLocale.parseDate-Methoden nicht ändern müssen, da sie bereits für die Verwendung des 'L'-Formats konfiguriert sind, das durch den Aufruf von moment.locale(newValue) geändert wird.

Weitere Informationen zur Anpassung der Ländereinstellung finden Sie in der Dokumentation zu $ ​​mdDateLocaleProvider: https://material.angularjs.org/latest/api/service/ $ mdDateLocaleProvider

Bonus: So kann die Sprachauswahl aussehen:

<md-select ng-model="BaseCtrl.language" class="md-no-underline">
  <md-option
    ng-repeat="language in ['en', 'de', 'fr', 'nl']"
    ng-value ="language"
  ><span
    class    ="flag-icon flag-icon-{{language ==='en' ? 'gb' : language}}"
  ></span>
  </md-option>
</md-select>

- Wenn wir md-DatePicker in md-dialog verwenden, formatiert der $ mdDateLocaleProvider-Dienst das Datum nicht so, wie wir es brauchen. Wir müssen $ mdDateLocale im Controller von md-dialog verwenden, um das Datum von md-DatePicker zu formatieren. zum Beispiel -

angular.module('MyApp').controller('AppCtrl', function($scope, $mdDateLocale) {

  $mdDateLocale.formatDate = function(date) {
    return moment(date).format('YYYY-MM-DD');
  };

  $scope.myDate = new Date('2015-10-15');

  $scope.minDate = new Date();

  $scope.maxDate = new Date();
});
4

Unter Verwendung von $filter anstelle von moment.js und in Bezug auf die Antworten von @Ian Poston Framer und @Java dev für mich funktionierte schließlich Folgendes:

angular
    .module('App', ['ngMaterial'])
    .run(function($mdDateLocale, $filter) {
        $mdDateLocale.formatDate = function(date) {
            return $filter('date')(date, "dd-MM-yyyy");
        };
    })

Ich konnte $filter nicht in .config injizieren, da es kein Anbieter ist, also musste ich es in .run mit $mdDateLocale tun.

3
marcinowski

Ich hatte das gleiche Problem und kam mit Hilfe von moment.js zu dieser einfachen Lösung. Ich habe das ng-change-Attribut verwendet, das ausgelöst wird, wenn das Datum geändert wird.

In Ihrem HTML-Code:

<md-datepicker ng-model="myDate" ng-change="dateChanged()"></md-datepicker>

In Ihrem Controller:

$scope.dateChanged = function() {
    this.myDate = moment(this.myDate).format('YYYY/MM/DD');
}
2
ttvd94

Ich möchte meine Lösung bereitstellen, die zu 100% auf Christiaan Westerbeeks Beitrag basiert. Ich mag, was er getan hat, aber ich persönlich wollte etwas Vereinfachtes.

appConfig.js

// config params in global scope that need to be set outside of Angular (due to Angular limitiations)
var appConfig = {
    // enables the dynamic setting of md-datepicker display masks (eg. when user changes language from English to Spanish)
    date: {
        // default mask
        format: "MM/dd/yyyy",

        // md-datepicker display format
        mdFormatDate: function (date) {
            if (date && date instanceof Date) {
                return date.format(appConfig.date.format);

            } else {
                return null;

            }

        }

    }

};

app.material.config.js

// set angular material config
app.config(['$mdDateLocaleProvider', function ($mdDateLocaleProvider) {
    // this is a global object set inside appConfig.js
    $mdDateLocaleProvider.formatDate = appConfig.date.mdFormatDate;

}]);

eine Servicedatei, die sich mit Lokalisierung/Übersetzungen/etc befasst

// inside the service where you'd track the language/locale change
service._updateConfigDateFormat = function (theNewDateFormat) {
    // where theNewDateFormat is something like 'yyyy/MM/dd' or whatever
    daepConfig.date.format = theNewDateFormat;

};

Es ist zu beachten, dass diese Lösung nicht die Anzeigewerte Ihres md-datepickers live neu formatiert. Dies funktioniert nur, wenn das Modell Werte ändert.

1
jc_

Für angular-material> = 5.x.x

Die empfohlene Verwendung anderer benutzerdefinierter/vordefinierter Datumsformate ist in der angular Materialdokumentation beschrieben:

https://material.angular.io/components/datepicker/overview#choosing-a-date-implementation-and-date-format-settings

Ein Implementierungsbeispiel mit MomentJS zum Anpassen und Parsen der Datums-/Uhrzeitanzeige Formate :

...
import { MomentModule } from 'angular2-moment';

import { MatMomentDateModule, MomentDateAdapter, MAT_MOMENT_DATE_FORMATS } from '@angular/material-moment-adapter';
import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core';

...

// moment formats explanation: https://momentjs.com/docs/#/displaying/format/
export const MY_FORMATS = {
    parse: {
      dateInput: 'YYYY-MM-DD',
    },
    display: {
      dateInput: 'YYYY-MM-DD',
      monthYearLabel: 'MMM YYYY',
      dateA11yLabel: 'YYYY-MM-DD',
      monthYearA11yLabel: 'MMMM YYYY',
    },
  };

  ...

@Component({
    ...
    providers: [
        // `MomentDateAdapter` and `MAT_MOMENT_DATE_FORMATS` can be automatically provided by importing
        // `MatMomentDateModule` in your applications root module. We provide it at the component level
        // here, due to limitations of our example generation script.
        {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]},
        // {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS},
        {provide: MAT_DATE_FORMATS, useValue: MY_FORMATS}
    ]
})

...

Abhängig von Ihrer Implementierung müssen Sie in der Komponente möglicherweise auch Folgendes verwenden:

date = new FormControl(moment());

Sie müssen auch die Moment-Bibliothek und den Adapter für Angular installieren:

https://www.npmjs.com/package/angular2-moment

npm install --save angular2-moment

https://www.npmjs.com/package/@angular/material-moment-adapter

npm install --save @ angle/material-moment-adapter

1
Alex Pandrea

Wenn Sie die neueste Version von angle-material.js verwenden, verwenden Sie den Dienst $ mdDateLocale. In diesem Codebeispiel wird der eingebaute Datumsfilter von angle als Alternative zur Verwendung der Bibliothek Moment.js verwendet. Weitere Optionen zum Datumsformat mit dem $ filter-Service von Winkel finden Sie hier https://docs.angularjs.org/api/ng/filter/date .

// mainController.js
angular.module('app').config(function($mdDateLocale, $filter, $scope) {

  // FORMAT THE DATE FOR THE DATEPICKER
  $mdDateLocale.formatDate = function(date) {
        return $filter('date')($scope.myDate, "mediumDate");
  };

});
0

in meinem Fall habe ich den PlaceHolder verloren. Alles funktioniert, aber der PlaceHolder verschwand, wenn ich eine benutzerdefinierte Formatierung verwende. Die folgenden Zeilen haben mein Problem mit Platzhaltern gelöst.

$mdDateLocaleProvider.formatDate = function (date) {
                if(date==null)
                return "";
                var m = moment(date);
                return m.isValid() ? m.format('L') : '';
            };
0
katmanco

Ich habe $mdDateLocaleProvider verwendet, um es am Rand zu formatieren. Wenn Sie das Datum formatieren möchten, während Sie es an das hintere Ende senden, funktionierte Folgendes für mich: -

$filter('date')(this.date, 'MM/dd/yyyy');

Ich habe den oben genannten Controller.

0
java dev