Jak korzystać z biblioteki moment.js w aplikacji maszynopisu kątowego 2?


231

Próbowałem użyć go z powiązaniami maszynopisu:

npm install moment --save
typings install moment --ambient -- save

test.ts:

import {moment} from 'moment/moment';

I bez:

npm install moment --save

test.ts:

var moment = require('moment/moment');

Ale kiedy wywołuję moment.format (), pojawia się błąd. Czy powinno być proste, czy ktoś może podać kombinację wiersza polecenia / importu, która działałaby?


1
udostępnij swój błąd
basarat

1
Jeśli zainstaluję moment.d.ts i użyję importu, dostanę błąd kompilacji BŁĄD w ... / typings / browser / ambient / moment / moment.d.ts (9,21): błąd TS2503: Nie mogę znaleźć przestrzeni nazw „moment” . A jeśli nie zainstaluję typowania i nie będę go używać, otrzymam Uncaught TypeError: moment.format nie jest funkcją
Sergey Aldoukhov

Jest tu zbyt wiele starych odpowiedzi. Proszę spojrzeć tutaj: github.com/angular/angular-cli/wiki/…
Didia

3
Odpowiedź Hinrich pracował dla mnie z NG4 (stan na czerwiec 2017) stackoverflow.com/a/43257938/1554495
polędwica

Siergiej Aldoukhov czy to wciąż najlepsza odpowiedź? na pewno @ Hinrich's jest?
jenson-button-event

Odpowiedzi:


513

Aktualizacja kwietnia 2017 r .:

Począwszy od wersji 2.13.0, Moment zawiera plik definicji maszynopisu. https://momentjs.com/docs/#/use-it/typescript/

Po prostu zainstaluj go z npm w swoim typie konsoli

npm install --save moment

A następnie w aplikacji Angular importowanie jest tak proste:

import * as moment from 'moment';

To wszystko, masz pełną obsługę maszynopisu!

Edycja bonusowa: Aby wpisać zmienną lub właściwość, jak Momentw maszynie do pisania, możesz to zrobić np .:

let myMoment: moment.Moment = moment("someDate");

1
czy ważne jest, aby dodać go do pliku app.module i zaimportować tablicę? czy możesz po prostu zaimportować go do komponentu i użyć go?
Katherine R.

3
@Katherine R Możesz go użyć w dowolnym pliku, nie jest on specyficzny dla Angulara.
Hinrich

A co z wtyczkami momentowymi, takimi jak moment-round?
Greywire

2
W rzeczywistości ta odpowiedź nie jest specyficzna dla Angulara, dotyczy każdego projektu maszynopisu.
Hinrich,

Świetnie, a jak używać potoku na szablonie?
vladanPro

98

momentjest globalnym zasobem strony trzeciej. Ten moment trwa windoww przeglądarce. Dlatego nie jest to poprawne importw twojej aplikacji angular2. Zamiast tego umieść <script>tag w pliku HTML, który załaduje plik moment.js.

Aby uszczęśliwić TypeScript, możesz dodać

declare var moment: any;

u góry plików, gdzie używasz go, aby zatrzymać błędy kompilacji, lub możesz użyć

///<reference path="./path/to/moment.d.ts" />

lub użyj tsd, aby zainstalować plik moment.d.ts, który może samodzielnie znaleźć TypeScript.

Przykład

import {Component} from 'angular2/core';
declare var moment: any;

@Component({
    selector: 'example',
    template: '<h1>Today is {{today}}</h1>'
})
export class ExampleComponent{
    today: string = moment().format('D MMM YYYY');
}

Pamiętaj tylko, aby dodać tag skryptu do kodu HTML, w przeciwnym razie moment nie będzie istniał.

<script src="node_modules/moment/moment.js" />

Ładowanie modułu moment

Najpierw musisz skonfigurować moduł ładujący, taki jak System.js, aby załadować chwilowe pliki commonjs

System.config({
    ...
    packages: {
        moment: {
            map: 'node_modules/moment/moment.js',
            type: 'cjs',
            defaultExtension: 'js'
        }
    }
});

Następnie zaimportuj moment do pliku, w razie potrzeby użyj

import * as moment from 'moment';

lub

import moment = require('moment');

EDYTOWAĆ:

Istnieją również opcje z niektórymi programami pakującymi, takimi jak Webpack lub Konstruktor SystemJS lub Browserify, które utrzymają chwilę na obiekcie okna. Aby uzyskać więcej informacji na ten temat, odwiedź odpowiednie strony internetowe w celu uzyskania instrukcji.


3
Jest to możliwe, ale jest bardzo długie, ponieważ musisz mieć moduł ładujący, taki jak Systemładowanie w wersji chwilowej węzła commonjs, a następnie będziesz w stanie odwoływać się do niego import * as moment from 'moment';lub z import moment = require('moment');którym we wszystkich celach i celach są identyczne, ale mają pewne subtelne różnice w maszynopisie.
SnareChops

@SnareChops typings install moment --ambient -- savenie pobiera typingspliku definicji i nie tworzy odniesienia do ///<reference path="./path/to/moment.d.ts" />? Mam ten sam błąd podczas uruchamianianpm run tsc
Shawn Northrop

To jest mylące; z niczym nie ma nic złego import.
Stiggler

2
Ta odpowiedź jest niekompletna, ponieważ do zarządzania definicją momentu musisz używać Pisania. Ponadto nie trzeba niczego importować. Proszę zobaczyć moją odpowiedź poniżej .
Bernardo Pacheco

8
Ta odpowiedź jest myląca, fakt, że moment jest zmienną globalną, nie oznacza, że ​​„musisz” załadować ją jako znacznik skryptu. Możesz i powinieneś spakować go w pliku dostawcy, jeśli korzystasz z jakiegoś pakietu (Webpack). Możesz także obejść globalne przypisanie, jeśli używasz webpacka i odpowiedniego programu ładującego.
Shlomi Assaf

49

Poniższe działało dla mnie.

Najpierw zainstaluj na chwilę definicje typów.

typings install moment --save

(Uwaga: NIE --ambient )

Następnie, aby obejść brak odpowiedniego eksportu:

import * as moment from 'moment';

2
Musiałem import moment from "moment";zamiast tego zrobić, żeby działało.
Aetherix

3
Ta odpowiedź jest niepełna, ponieważ nie musisz niczego importować. Proszę zobaczyć moją odpowiedź poniżej .
Bernardo Pacheco

1
Również każda iteracja jonowej 2 beta / kątowej 2 rc wydawała się wprowadzać nowy sposób importowania rzeczy, więc być może będziesz musiał wypróbować kilka z tych sugestii, nawet jeśli jeden punkt były kiedyś najbardziej aktualną odpowiedzią
discodane

import * as moment from 'moment';jest kluczem.
nima

Nie mogę znaleźć „rejestru” („npm”) w rejestrze. kiedy próbuję zainstalować definicje, pomóżcie proszę
Sebastián Rojas

28

Wybrałbym następujące:

npm install moment --save

Do tablicy systemjs.config.jspliku mapdodaj:

'moment': 'node_modules/moment'

do packagestablicy dodaj:

'moment': { defaultExtension: 'js' }

W pliku component.ts użyj: import * as moment from 'moment/moment';

i to wszystko. Możesz użyć z klasy swojego komponentu:

today: string = moment().format('D MMM YYYY');


25

Używamy teraz modułów,

próbować import {MomentModule} from 'angular2-moment/moment.module';

po npm install angular2-moment

http://ngmodules.org/modules/angular2-moment


76
Jest to niewystarczające, ponieważ instaluje tylko rury. Najwyraźniej nie można w ten sposób pracować z datami Moment w swoich modułach.
ntaso,

1
chętnie podpowiedziałby, jak korzystać z filtrów kątowych 2-momentowych w klasie komponentów
trickpatty

3
powinno to być: import {MomentModule} z 'angular2-moment / moment.module';
yasser

1
To nie powinna być już wybrana odpowiedź. Spójrz na odpowiedź @Hinricha. npm install moment --save, npm install @types/moment --save stackoverflow.com/questions/35166168/…
jamesjansson

zamiast instalowania opakowania powinno to wyglądać tak:import * as moment from 'moment';
M. Atif Riaz

22

Aby użyć go w Typescriptprojekcie, musisz zainstalować moment:

npm install moment --save

Po chwili instalacji możesz użyć go w dowolnym .tspliku po zaimportowaniu:

import * as moment from "moment";


1
Uwaga ** @ typy / moment @ 2.13.0: To jest definicja typów kodów pośredniczących dla Moment ( github.com/moment/moment ). Moment udostępnia własne definicje typów, więc nie trzeba instalować @ typów / momentu!
Winnemucca

1
Wspaniały! Oto oficjalne odniesienie: momentjs.com/docs/#/use-it/typescript
Andrea

14

--- Aktualizacja 11.01.2017

Pisanie jest teraz przestarzałe i zostało zastąpione przez npm @types . Od teraz uzyskanie deklaracji typu nie będzie wymagało żadnych narzędzi oprócz npm. Aby użyć Moment, nie trzeba instalować definicji typów @types ponieważ Moment już udostępnia własne definicje typów.

Sprowadza się to więc do zaledwie 3 kroków:

1 - moment instalacji, który zawiera definicje typów:

npm install moment --save

2 - Dodaj znacznik skryptu do pliku HTML:

<script src="node_modules/moment/moment.js" />

3 - Teraz możesz go po prostu użyć. Kropka.

today: string = moment().format('D MMM YYYY');

--- Oryginalna odpowiedź

Można to zrobić w zaledwie 3 krokach:

1 - Zainstaluj definicję momentu - plik * .d.ts :

typings install --save --global dt~moment dt~moment-node

2 - Dodaj znacznik skryptu do pliku HTML:

<script src="node_modules/moment/moment.js" />

3 - Teraz możesz go po prostu użyć. Kropka.

today: string = moment().format('D MMM YYYY');

Mam problem z wersją do pisania, która jest dostępna w dt. Używa starej wersji chwili, która nie ma nowych metod, których chcę użyć. Jeśli zrobię to, co zalecają ( momentjs.com/docs/#/use-it/system-js ), aplikacja się kompiluje, ale nie ładuje się w przeglądarce. Prawie zbliżam się do ślepego zaułka ...
Fabricio

Nie mogłem zmusić tagu skryptowego do pracy z kątowym cli. Ma jednak większy sens niż importowanie
Winnemucca

@Bernardo Próbowałem wykonać twoje kroki i zainstalowałem moment.js. Po declare var moment;Jednak pisanie nie działa dla mnie. Po wpisaniu moment().bez inteligencji. Chyba brakuje mi tutaj kilku kroków.
Shyamal Parikh

Jestem całkiem pewien, że to nie działa, skąd pakiet internetowy wie, aby włączyć to w modułach kompilacji?
Johnny 5

12

Dla Angular 7+ (obsługuje również 8 i 9) :

1: Zainstaluj moment za pomocą polecenia npm install moment --save

2: Nie dodawaj nic do app.module.ts

3: Po prostu dodaj instrukcję importu na górze component lub dowolnego innego pliku, takiego jak ten:import * as moment from 'moment';

4: Teraz możesz używać momentdowolnego miejsca w kodzie. Tak jak:

myDate = moment(someDate).format('MM/DD/YYYY HH:mm');


Musiałem importować w ten sposób: w import * as moment_ from 'moment'; const moment = moment_;przeciwnym razie dostawałemError: Cannot call a namespace ('moment')
Snook

Bardzo dziwnie słuchać. moment_to tylko dosłowne imię. Myślę, że może to być cokolwiek ...
Rahmat Ali,

1
Pamiętaj tylko, że import * as moment from 'moment';zwiększysz rozmiar pakietu o ~ 500 KB. Jest dobry artykuł wyjaśniający problem z rozwiązaniem medium.jonasbandi.net/…
Kosmonaft

9

z ng CLI

> npm install moment --save

w app.module

import * as moment from 'moment';

providers: [{ provide: 'moment', useValue: moment }]

w składniku

constructor(@Inject('moment') private moment)

w ten sposób zaimportujesz chwilę

AKTUALIZACJA Kątowe => 5

{
   provide: 'moment', useFactory: (): any => moment
}

Dla mnie działa w prod, ale także w wersji uniwersalnej

Nie lubię korzystać z żadnego momentu, ale wykorzystuję moment

Error   Typescript  Type 'typeof moment' is not assignable to type 'Moment'. Property 'format' is missing in type 'typeof moment'.

Dostaję Parameter 'moment' implicitly has an 'any' typebłąd.
Azymut

Czy to działa dla ciebie w trybie prod? Działa dobrze w trybie deweloperskim, ale kiedy uruchamiam moją aplikację w trybie prod, nie działa. Moja aplikacja ma również moduły ładowane z opóźnieniem (na wszelki wypadek). moment kończy się na wartości zerowej.
jbgarr

@jbgarr Próbowałem w leniwym module, takim jak konstruktor (@Inject ('moment') private moment) {console.log ('date', moment ()); } bez problemów
Whisher,

8

Biblioteka angular2-moment ma potoki takie jak {{myDate | amTimeAgo}} do użycia w plikach .html.

Do tych samych potoków można również uzyskać dostęp jako funkcje maszynopisu w pliku klasy komponentów (.ts). Najpierw zainstaluj bibliotekę zgodnie z instrukcją:

npm install --save angular2-moment

W node_modules / angular2-moment będą teraz pliki „.pipe.d.ts”, takie jak calendar.pipe.d.ts , date-format.pipe.d.ts i wiele innych.

Każda z nich zawiera nazwę funkcji Typescript dla równoważnego potoku, na przykład DateFormatPipe () jest funkcją dla amDateFormatPipe .

Aby użyć DateFormatPipe w swoim projekcie, zaimportuj go i dodaj do globalnych dostawców w app.module.ts:

import { DateFormatPipe } from "angular2-moment";
.....
providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}, ...., DateFormatPipe]

Następnie w dowolnym komponencie, w którym chcesz użyć funkcji, zaimportuj ją na górze, wstrzyknij do konstruktora i użyj:

import { DateFormatPipe } from "angular2-moment";
....
constructor(.......,  public dfp: DateFormatPipe) {
    let raw = new Date(2015, 1, 12);
    this.formattedDate = dfp.transform(raw, 'D MMM YYYY');
}

Aby użyć dowolnej funkcji, wykonaj ten proces. Byłoby miło, gdyby istniał jeden sposób uzyskania dostępu do wszystkich funkcji, ale żadne z powyższych rozwiązań nie działało dla mnie.


To niesamowite dzięki! Wszędzie przez moment kątowy 2 pokazuje, jak używać go tylko na szablonie. Twój bardzo pomocny post pokazał mi, jak używać go do manipulowania wartością, zanim wyślę go do szablonu.
Andrew Junior Howard

@royappa Widzę, że niektórzy używają modułu Pipes, a niektórzy używają chwili, aby uzyskać do nich dostęp w maszynowym pisma. Rozumiem, że mówisz, że możesz używać wersji Pipe w maszynopisie, ale jaka szkoda przy instalacji obu?
Jacques

5

Jeśli możesz dodawać więcej pakietów innych firm, skorzystałem z biblioteki angular2-moment . Instalacja była dość prosta i należy postępować zgodnie z najnowszymi instrukcjami na README. W związku z tym zainstalowałem także pisanie .

Dla mnie działało to jak urok i prawie nie dodałem żadnego kodu, aby go uruchomić.


5

Nie jestem jednak pewien, czy nadal jest to problem dla ludzi ... Używanie SystemJS i MomentJS jako biblioteki, rozwiązało to dla mnie

/*
 * Import Custom Components
 */
import * as moment from 'moment/moment'; // please use path to moment.js file, extension is set in system.config

// under systemjs, moment is actually exported as the default export, so we account for that
const momentConstructor: (value?: any) => moment.Moment = (<any>moment).default || moment;

Stąd działa dla mnie dobrze.


5

dla angular2 RC5 to zadziałało dla mnie ...

pierwszy moment instalacji za pośrednictwem npm

npm install moment --save

Następnie zaimportuj moment do komponentu, którego chcesz użyć

import * as moment from 'moment';

na koniec skonfiguruj moment w „map” i „paczkach” systemjs.config.js

// map tells the System loader where to look for things
  var map = {
  ....
  'moment':                     'node_modules/moment'
  };
  // packages tells the System loader how to load when no filename and/or no extension
  var packages = {
    ...
    'moment':                       { main:'moment', defaultExtension: 'js'}
  };

Masz pojęcie o tym, jaki jest równoważny krok dla pakietu WWW?
Bharat Geleda,

@BharatGeleda Nie musisz nic robić z webpack. Używając Angular2 i angular-cli musiałem npm npm zainstalować i zaimportować. Nie potrzebowałem żadnego pisania, ponieważ ostatnia wersja chwili obsługuje maszynopis.
Stanislasdrg Przywróć Monikę

1
Jedyne rozwiązanie, które zmusiło mnie do zaimportowania innej lokalizacji: import 'moment/locale/de.js';dzięki!
iBaff,

4

Oprócz odpowiedzi SnareChop musiałem zmienić plik piszący dla momentjs.

W moment-node.d.tszastąpiłem:

export = moment;

z

export default moment;


4

Moja własna wersja używania Moment in Angular

npm i moment --save

import * as _moment from 'moment';

...

moment: _moment.Moment = _moment();

constructor() { }

ngOnInit() {

    const unix = this.moment.format('X');
    console.log(unix);    

}

Najpierw importuj moment jako _moment, a następnie zadeklaruj momentzmienną o typie _moment.Momento wartości początkowej _moment().

Zwykły import momentu nie zapewni żadnego automatycznego uzupełniania, ale jeśli zadeklarujesz moment z Momentinterfejsem typu z _momentprzestrzeni nazw z 'moment'pakietu zainicjowanego z wywołaną przestrzenią nazw momentów_moment() , automatycznie dokończysz api chwili.

Myślę, że jest to najbardziej kątowy sposób używania momentu bez użycia @types typingslub angularnych dostawców, jeśli szukasz automatycznego uzupełniania bibliotek javascript waniliowych, takich jak moment.


Zainstalowanie typów pozwoli ci uzyskać dostęp do autouzupełniania:npm install @types/moment --save
jamesjansson

3

Spróbuj dodać "allowSyntheticDefaultImports": truedo swojegotsconfig.json .

Co robi flaga?

Zasadniczo informuje to kompilator TypeScript, że można użyć instrukcji importu ES6, tj

import * as moment from 'moment/moment';

w module CommonJS, takim jak Moment.js, który nie deklaruje domyślnego eksportu. Flaga wpływa tylko na sprawdzanie typu, a nie na generowany kod.

Jest to konieczne, jeśli używasz SystemJS jako modułu ładującego moduł. Flaga zostanie automatycznie włączona, jeśli powiesz swojemu kompilatorowi TS, że używasz SystemJS:

"module": "system"

Spowoduje to również usunięcie wszelkich błędów zgłaszanych przez IDE, jeśli są one skonfigurowane do korzystania z tsconfig.json.


2

dla angular2 z systemjs i jspm musiał zrobić:

import * as moment_ from 'moment';
export const moment =  moment_["default"];

var a = moment.now();
var b = moment().format('dddd');
var c = moment().startOf('day').fromNow();

2

Dla użytkowników ANGULAR CLI

Korzystanie z bibliotek zewnętrznych znajduje się w dokumentacji tutaj:

https://github.com/angular/angular-cli/wiki/stories-third-party-lib

Wystarczy zainstalować bibliotekę za pośrednictwem

npm install lib-name --save

i zaimportuj go do swojego kodu. Jeśli biblioteka nie zawiera typowania, możesz je zainstalować, używając:

npm install lib-name --save

npm install @ types / lib-name --save-dev

Następnie otwórz plik src / tsconfig.app.json i dodaj go do tablicy typów:

„types”: [„lib-name”]

Jeśli biblioteka, dla której dodałeś typy, ma być używana tylko w testach e2e, zamiast tego użyj e2e / tsconfig.e2e.json. To samo dotyczy testów jednostkowych i src / tsconfig.spec.json.

Jeśli biblioteka nie ma dostępnych typów w @ typy /, możesz nadal z niej korzystać, ręcznie dodając do niej typy:

Najpierw utwórz plik typings.d.ts w folderze src /.

Ten plik zostanie automatycznie dołączony jako definicja typu globalnego. Następnie w src / typings.d.ts dodaj następujący kod:

zadeklaruj moduł „typeless-package”;

Na koniec w komponencie lub pliku korzystającym z biblioteki dodaj następujący kod:

import * as typelessPackage z 'typeless-package'; typelessPackage.method ();

Gotowe. Uwaga: może być potrzebne lub przydatne, aby zdefiniować więcej typów dla biblioteki, której próbujesz użyć.


Sprawdź ten artykuł, jeśli potrzebujesz instrukcji krok po kroku. medium.com/@jek.bao.choo/…
wag0325

1

Postępowałem zgodnie z poradami, aby zezwolić na importSyntheticDefaultImports (ponieważ od teraz nie ma dla mnie eksportu), używając Systemu. Następnie zastosowałem się do czyjejś porady:

import moment from 'moment';

Z chwilą mapowane w mojej konfiguracji system.js. Z innych powodów inne wyciągi z importu nie działałyby dla mnie


To jest teraz ostatnia odpowiedź, ale jedyna, która działa!
TJL

1

Dla mnie działało:

typings install dt~moment-node --save --global

Węzeł momentu nie istnieje w repozytorium typów. Musisz przekierować do Zdecydowanie wpisanego, aby działał za pomocą przedrostka dt.


1

Z systemjs to, co zrobiłem, to wewnątrz mojej systemjs.config dodałem mapę moment

map: {
   .....,
   'moment': 'node_modules/moment/moment.js',
   .....
}

A potem możesz łatwo importować moment, wykonując czynności

import * as moment from 'moment'

1

Wiem, że to stary wątek, ale dla mnie najprostszym rozwiązaniem, które faktycznie działało, było:

  1. Instalacja najpierw npm install moment --save
  2. W moich komponentach wymagających go z node_modules i użyj go:
const moment = require('../../../node_modules/moment/moment.js');

@Component({...})
export class MyComponent {
   ...
   ngOnInit() {
       this.now = moment().format();
   }
   ...
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.