• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[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: http://ckn.li:3000 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:

sars

Agent Provocateur

Registriert
15 Juli 2013
Beiträge
54
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?
 

CroneKorkN

★ ☆ ☆ ☆ ☆

Registriert
6 Aug. 2014
Beiträge
289
Ort
0176 323 223 71
  • 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 :)
 

epiphora

aus Plastik
Veteran

Registriert
14 Juli 2013
Beiträge
3.894
Ort
DE-CIX
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. :)
 

CroneKorkN

★ ☆ ☆ ☆ ☆

Registriert
6 Aug. 2014
Beiträge
289
Ort
0176 323 223 71
  • 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.
 

epiphora

aus Plastik
Veteran

Registriert
14 Juli 2013
Beiträge
3.894
Ort
DE-CIX
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.
 

Kugelfisch

Nerd

Registriert
12 Juli 2013
Beiträge
2.342
Ort
Im Ozean
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. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.
 

CroneKorkN

★ ☆ ☆ ☆ ☆

Registriert
6 Aug. 2014
Beiträge
289
Ort
0176 323 223 71
  • 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.
 
Oben