2012-07-02 35 views
22

Ich arbeite an einer NodeJS-App (es ist ein Spiel). In diesem Fall habe ich einen Code eingerichtet, so dass, wenn eine Person den Index besucht und ein Zimmer auswählt, wird sie in den richtigen Raum umgeleitet.Zugriff auf EJS-Variable in Javascript-Logik

jetzt ist es so gemacht wird, mit Express v2.5.8:

server.get("/room/:name/:roomId, function (req, res) { 
    game = ~databaseLookup~ 
    res.render("board", { gameState : game.gameState }); 
} 

Over in board.ejs kann ich die gameState Weise wie dies mit Code zugreifen:

<% if (gameState) { %> 
    <h2>I have a game state!</h2> 
<% } %> 

Gibt es eine Möglichkeit für mich, dies in meine JavaScript-Logik zu importieren? Ich möchte in der Lage sein, etwas wie var gs = ~ import ejs gameState ~

und dann in der Lage zu tun, was ich will damit - Zugriff auf seine Variablen, drucken Sie es zur Überprüfung auf Konsole. Irgendwann möchte ich mit diesem Spielstatus das Board richtig anzeigen, und dazu muss ich Dinge tun, wie zum Beispiel auf die Positionen der Teile zugreifen und sie dann richtig auf dem Bildschirm anzeigen.

Danke!

Antwort

32

Sie könnten die Spielstatusvariable direkt in Javascript auf der Seite injizieren.

<% if (gameState) { %> 
    <h2>I have a game state!</h2> 
    <script> 
     var clientGameState = <%= gameState %>    
    </script> 
<% } %> 

Eine andere Möglichkeit könnte darin bestehen, einen AJAX-Aufruf an den Server zurück, sobald die Seite bereits geladen wurde, kehren die gameState JSON und clientGameState auf die JSON-Antwort gesetzt.

Sie können auch in interessieren: How can I share code between Node.js and the browser?

+1

Ich habe beschlossen, mit dem AJAX-Aufruf zu rollen, sobald die Seite bereits geladen ist. Das Problem mit Ihrem obigen Code ist, dass <% = gameState%> zu [object Object] ausgewertet wird, was überhaupt nicht das ist, was ich möchte. Vielen Dank! –

+0

Ich benutze <% include script%> am unteren Ende aller meiner Seiten, an denen einige Standard-Daten übergeben wurden, wie Anfrageobjekt, Benutzerobjekt, Formularfehler. – chovy

+8

Wenn der Code zu [object Object] ausgewertet wird, schlage ich vor, 'JSON.stringify (game.gameState)' serverseitig zu verwenden. Dann wird das stringifizierte Objekt in das Skript-Tag eingefügt. Da das ejs-Rendering in der Regel für HTML-Zeichen keine Sonderzeichen enthält, verwenden Sie 'var clientGameState = <% - gameState%>' innerhalb des Skript-Tags (anstelle von '<% =') Wenn Sie den Spielstatus zum Rendern benötigen die Seite auch, Sie können eine JSON.parse() machen, um darüber zu loopen usw. – Matthias

4

Ich glaube, dass die folgende Logik besser ist und es für mich gearbeitet.

Angenommen, die an die ejs-Seite übergebene Variable ist uid, Sie können den Inhalt des Tags div oder einen h Tag mit der Variablen übergeben haben. Sie können auf den Inhalt des Tags div oder h im Skript zugreifen und ihn einer Variablen zuweisen.

folgendes Codebeispiel: (in EJS)

<script type="text/javascript"> 
    $(document).ready(function() { 
     var x = $("#uid").html(); 
     alert(x); // now JS variable 'x' has the uid that's passed from the node backend. 
    }); 
</script> 

<h2 style="display:none;" id="uid"><%=uid %></h2> 
+0

Mit dem obigen Code können Sie problemlos das gesamte UID-Objekt anzeigen, wenn Sie die Quelle anzeigen. Dies ist nicht der richtige Ansatz, obwohl es funktioniert – vardha