[gelöst] Rails und JS: Variable plötzlich leer?

CroneKorkN

★ ☆ ☆ ☆ ☆
Registriert
6 Aug. 2014
Beiträge
289
Ort
0176 323 223 71
Hallo Brett,

Ich bastele gerade an einem Dienstplanprogramm: user: ngb; pass: ngb

Es basiert auf Rails 4.1 mit aktivierten Turbolinks. Es ist das erste Projekt, bei dem ich mich intensiver mit Ruby und Javascript auseinandersetze. Bis jetzt komme ich gut voran, doch hat sich jetzt ein Bug eingeschlichen, den ich nicht loswerde.

Bug
  • Einloggen
  • einen Dienst anwählen (zb [Früh])
  • Einige Dienste mit gedrückter Maustaste eintragen
  • Über die Pfeile Monat oder Jahr wechseln
  • wieder einen Dienst anwählen -> geht nicht

Bildschirmfoto von »2014-08-31 21:08:31«.png

Die Konsole sagt: TypeError: month is not a function application.js:28 Die month-Variable beinhaltet den Code für den Dienstplan. Es gibt noch jeweils eine für den Wochenplaner, den Arbeitsbedarfsplaner und für allgemeinen Code. Nach einem Reload der Seite und nach einem Turbolinks-Load sollten diese Funktionen gestartet werden:

[src=javascript]var ready;
ready = function() {
layout();
month();
week();
manpower();
}

$(document).ready(ready);
$(document).on('page:load', ready);[/src]

Nachdem man einige Dienste geplant und anschließend das Datum gewechselt hat, sind diese Variablen aber offenbar aus einem mir nicht verständlichen Grund zurückgesetzt.

Der Fehler Tritt nicht auf...
...wenn man das Datum wechselt, ohne vorher einen Dienst einzutragen. Nach einem Reload ist alles wieder heile. Rails nutzt "turbolinks". Dadurch wird beim Klicken eines Links nur der <body> der Seite neu geladen. Beim wechseln des Datums gibt es folglich keinen Reload.

====

Jemand eine Idee woran es liegen könnte oder wie ich selbst dahinter komme?

MfG,
ckn
 
Zuletzt bearbeitet:
Re: Rails und JS: Variable plötzlich leer?

Naja, schau dir mal deine month.js an:

[src=javascript]var month = function() { ...
[/src]

und innerhalb von month()..

[src=javascript]
//
// Working time updater
//
...
month = $("#plan").attr("data-month");
...
[/src]

Siehst du das Problem?
 
  • Thread Starter Thread Starter
  • #3
Re: Rails und JS: Variable plötzlich leer?

Ja :) Ich verwende die Variable an einer anderen Stelle zu einem anderen Zweck.

Vielen Dank :)
 
Du scheinst [kw]month[/kw] ja mittlerweile in [kw]month_controller[/kw] umbenannt zu haben, sodass das Problem nicht mehr auftritt. Die globalen Variablen sind allerdings weiterhin im Code vorhanden. :) Wenn Du in der [kw]updateWorkingTime[/kw]-Methode vor [kw]id[/kw], [kw]year[/kw] und [kw]month[/kw] jeweils das [kw]var[/kw]-Schlüsselwort schreibst, dann existieren die Variablen auch nur dort und derartige Probleme sollten in Zukunft nicht mehr auftreten. :)
 
  • Thread Starter Thread Starter
  • #5
var definiert also lokale Variablen! Ich hab mir noch keine großen Gedanken darum gemacht, aber da ich neulich Variablen mit einem $-Zeichen gesehen habe, hatte ich mir darunter globale Variablen vorgestellt. In Ruby ist es genauso. Dachte var wäre mehr eine best practice, weil es bisher ganz gut ohne ging :D

Hab jetzt sämtliche Variablen als lokal deklariert und merke mir für die Zukunft, dies wann immer möglich zu tun.
 
var definiert also lokale Variablen! Ich hab mir noch keine großen Gedanken darum gemacht, aber da ich neulich Variablen mit einem $-Zeichen gesehen habe, hatte ich mir darunter globale Variablen vorgestellt.

Genau so ist es: Alle ohne [kw]var[/kw] deklarierten Variablen sind global. Das ist leider eine der schlechten Seiten von Javascript. Das [kw]$[/kw]-Zeichen hat in Javascript keinerlei Bedeutung, das ist ein Zeichen wie a, b oder _. Es wird meiner Erfahrung nach allerdings häufig verwendet, um zu kennzeichnen, dass eine Variable ein jQuery-Objekt mit einer Referenz auf ein DOM-Element ist. Das ist dann aber nicht mehr als eine Konvention.
 
Das ist allerdings eine Folge des Konzepts, dass JavaScript keine globalen Variablen im engeren Sinne kennt, stattdessen aber ein `Wurzelobjekt` existiert, auf dessen Eigenschaften ohne explizite Angabe einer Objektreferenz zugegriffen werden kann (vergleichbar mit einem global gültigen [kw]with[/kw]-Block). Im DOM, d.h. bei JavaScript im Browser, dient dazu das [kw]window[/kw]-Objekt. Verwendest du also Bezeichner, welche zuvor nicht mittels [kw]var[/kw]-Schlüsselwort als lokale Variablen deklariert wurden, greifst du auf die Eigenschaften des [kw]window[/kw]-Objekts zu, lesend wie schreibend. Daher sind z.B. die folgenden Zeilen äquivalent
[src=javascript]alert(innerHeight)
alert(window.innerHeight)
window.alert(innerHeight)
window.alert(window.innerHeight)[/src]
Aber auch
[src=javascript]foo = 42
window.foo = 42[/src]
Eine solche Verwendung des Wurzelobjekts in Zuweisungen wird im strict mode absichtlich eingeschränkt, vgl. .
 
  • Thread Starter Thread Starter
  • #8
Wenn ich irgendwo einer Variablen einen Wert zuweise, geht JS in der Hierarchie also so lange nach oben, bis es eine entsprechend benannte Variable findet. Kommt es bei der Wurzel an ohne Fündig zu werden, definiert es die Variable hier. Rubys Weg, einen undefined-Fehler auszuwerfen erscheint mir Sinnvoller. Javascripts Weg ist quick&dirty-geeigneter, aber weniger DAU-kompatibel :)

Vielen Dank.
 
Zurück
Oben