2014-07-01 15 views
15

Ich habe gerade das Formular [email protected] zu [email protected] in meiner Ember.js Anwendung aktualisiert und jetzt bekomme ich einen Fehler, der Moment ist nicht definiert, wenn ich moment() in die Konsole oder schließe sie in meine Skripte ein.moment.js Moment ist undefined

In den Dokumenten habe ich gesehen "Seit 2.4.0 ist das global exportierte Momentenobjekt veraltet." was ich denke ist das Problem hier, aber ich bin mir nicht sicher, wie ich global Moment in Ember setzen kann, so dass alle Verweise auf Moment() in unserer Code-Basis derzeit nicht gebrochen sind.

Ich habe versucht, die Zeile, wo wir gerade waren, zu aktualisieren ('Moment'), um var Moment = erfordern ('Moment'), aber es hat das gleiche Ergebnis. Selbst wenn ich einen Debugger direkt hinter die Zeile var moment = ... lege und dann moment() in die Konsole gebe, bekomme ich immer noch diesen Moment nicht definiert.

+0

Es muss etwas anderes sein, etwas, das mit requirejs in Konflikt steht? Ich habe vor ein paar Tagen eine Seite mit Moment 2.7.0 zum Testen eingerichtet, die buchstäblich nur '' in der Konsole enthält. Irgendwelche Fehler, die vor der Eingabe von Moment() geworfen werden? Vielleicht überprüfen Sie das Netzwerkprotokoll, um zu sehen, ob es geladen wird ... – Lex

+0

Welchen Geschmack von Glut verwenden Sie? Wenn Sie einen Build wie eak oder ember-cli verwenden, müssen Sie 'moment' im globalen Namespace aktivieren. Hast du das schon gemacht? – Grapho

+0

Ich verfolgte das Problem bis zum Loader Require-Modul des Knotens, das den Kontext nicht auf den erwarteten Moment setzt. Es setzt den Kontext auf den neuen Kontext {}. Dann im Augenblick prüft es, ob die Variable global definiert ist und wenn nicht (was nicht in meinem Fall ist), dann wird Moment die Momentvariable für das Objekt "this" setzen, das auf Kontext {} und nicht auf Fenster gesetzt wird . Die Ergebnisse werden momentan definiert, aber nicht auf globaler Ebene. Durch Ändern der letzten Zeile in der moment.js von Call (this) zu Call (window) funktioniert es jetzt. – Efarley

Antwort

11

Sie möchten den Abschnitt Browser der neuen Dokumentation.

So ...

<script src="moment.js"></script> 
<script> 
    moment().format(); 
</script> 

bearbeiten

gesagt haben, dass es so wahrscheinlich aussieht wird Ihnen das gleiche Problem.

Es sieht wie Moment.js versucht, Sie zu ermutigen, einen Paket-Manager zu verwenden, um den Namespace mit globalen Variablen nicht zu beschmutzen.

Gehe lesen Sie auf CommonJS und AMD, und versuchen Sie es in Ihrem aktuellen Stapel ein.

sollten Sie so etwas wie tun:

var moment = require('moment'); 

moment().format(); 

Aber um require Sie ein Modulsystem, wie die zuvor genannten verwenden müssen.

Aber

Die offensichtliche Lösung ist Ihre Version von Moment.js rückgängig zu machen, solange Sie keine neuen Funktionen brauchen. Wie wichtig kann ein Update auf einer einfachen Zeit/Datum Bibliothek wirklich sein?

+0

Ich brauche Zeitzone wir haben einen Zahlungsabbruch um 10 Uhr ET und ich muss überprüfen, dass der Cutoff mit der Zeit an der Ostküste nicht die lokale Maschine der Benutzer verglichen wird.Es ist ein bisschen unordentlicher, in der ganzen Logik zu addieren, um die Zeitzone des Benutzers zu prüfen und dann Daten anzupassen, um zur Ostküste zu gehen, wenn ich gerade moment() verwenden konnte. (Amerika/New_York). Es hört sich so an, als ob die Änderungen, die ich bis zum Moment gemacht habe, mir mehr Updates bringen als die Menge an Arbeit, die ich selbst mache. – Efarley

+0

mit [Moment Timezone] (http://momentjs.com/timezone/docs/) mit [RequireJS] (http://momentjs.com/timezone/docs/) sollte nicht zu schwierig zu implementieren sein. Aber ja, vielleicht wäre es einfacher, nur das JavaScript [Date Object] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) zu verwenden, wenn Sie nicht lernen wollen über Module. – shennan