2017-04-13 7 views
0

Ich habe einige Datums-ISO-Zeichenfolgen, die ich in menschenlesbare Daten formatieren möchte. Ich verwende die Bibliothek angular-moment, um diese Daten in meiner Vorlage mithilfe eines Filters zu formatieren.Globale Variablen in Winkeln

<span>{{ $ctrl.date | amCalendar:referenceTime:formats }}</span> 

Ich möchte das Format des Datums an die folgende Anzeige anpassen:

const dateFormats = { 
    relative: { 
    sameDay: '[Today at] LT', 
    lastWeek: 'DD MMM, YYYY [at] LT', 
    sameElse: 'DD MMM, YYYY [at] LT' 
    } 
} 

Also ich dies in meiner Vorlage tun können:

<span>{{ $ctrl.date | amCalendar:null:dateFormats }}</span> 

Allerdings möchte ich diese dateFormats irgendwo in der Welt zu leben, anstatt ausschließlich innerhalb des Controllers dieser Komponente, da ich in der Lage sein möchte, diese dateFormats in anderen Vorlagen auf der ganzen Linie zu verweisen.

Würde dies als richtiger Anwendungsfall für die Verbindung dateFormats mit $scope gelten oder gibt es einen besseren Weg, damit umzugehen?

Jede Hilfe wird geschätzt. Danke im Voraus!

+0

können Sie Konstante verwenden (was ein Singleton ist) this.refer diesem Link [link] zu tun (https://ilikekillnerds.com/ 2014/11/constants-values-global-variables-in-angularjs-the-right-way /)] –

+1

Schauen Sie sich [diese Antwort] (http://stackoverflow.com/a/42876416/4131048) dort an Es ist nicht notwendig, einen benutzerdefinierten Filter zu erstellen. Sie können 'amCalendar' in Ihrer 'run'-Funktion anpassen, wie in der [Docs] (https://github.com/urish/angular-moment#usage) – VincenzoC

+0

S beschrieben Ich hätte die Unterlagen durchsehen müssen. Das ist noch besser. Wenn Sie das als Antwort hinzufügen, akzeptiere ich. – realph

Antwort

1

Sie sollten einen eigenen benutzerdefinierten Filter erstellen. Etwas wie folgt aus:

angular 
    .module('myApp') 
    .filter('myDateFormat', ['$filter',function ($filter) { 
     const dateFormats = { 
     relative: { 
      sameDay: '[Today at] LT', 
      lastWeek: 'DD MMM, YYYY [at] LT', 
      sameElse: 'DD MMM, YYYY [at] LT' 
     } 
     } 
     return function() { 
     return $filter('amCalendar')(null, dateFormats) 
     } 
    }]); 

Jetzt können Sie einfach diesen Filter aus jeder Vorlage in Ihrem Modul verwenden:

<span>{{ $ctrl.date | myDateFormat }}</span> 
+0

Ja, ich denke, dass diese Herangehensweise der beste Weg ist und mich von Globals fern hält - für jetzt, haha. Vielen Dank! – realph

+0

@realph sicher, froh, ich könnte helfen :) – tanmay

2

Was ich für Termine tun, ist das Erstellen eines benutzerdefinierten Filter
wie zum Beispiel:

function ascDateFilter($filter) { 
    return function (input) { 
     return $filter('date')(input, "dd/MM HH:mm:ss"); 
    }; 
} 

Ihr so ​​etwas tun könnte und die amCalendar Filter in Ihrem benutzerdefinierten Filter verwenden. Damit haben Sie den gesamten Code, der das Datum im selben Filter templatiert.

0

Es gibt keine Notwendigkeit, einen benutzerdefinierten Filter zu erstellen, geben Sie amCalendar in Ihrem Lauf anpassen können Funktion wie in der docs beschrieben.

hier ein funktionstüchtiges Beispiel:

angular.module('MyApp',['angularMoment']) 
 
.run(function(){ 
 
    const dateFormats = { 
 
    calendar: { 
 
     sameDay: '[Today at] LT', 
 
     lastWeek: 'DD MMM, YYYY [at] LT', 
 
     sameElse: 'DD MMM, YYYY [at] LT' 
 
    } 
 
    } 
 
    moment.updateLocale('en', dateFormats); 
 
}) 
 
.controller('AppCtrl', function($scope) { 
 
    $scope.date = new Date(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-moment/1.0.1/angular-moment.min.js"></script> 
 

 
<div ng-app="MyApp" ng-controller="AppCtrl"> 
 
    <span>{{ date | amCalendar }}</span> 
 
</div>