2012-07-02 107 views
22

我正在研究NodeJS應用程序(這是一款遊戲)。在這種情況下,我設置了一些代碼,當一個人訪問索引並選擇房間時,他會被重定向到合適的房間。在Javascript邏輯中訪問EJS變量

現在它正在做這樣的,用快遞v2.5.8:

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

結束在board.ejs我可以用代碼訪問遊戲狀態的方式是這樣的:

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

有一種讓我將它導入到我的JavaScript邏輯中的方法?我希望能夠做到像 var gs =〜import ejs gameState〜

然後能夠做任何我想要的東西 - 訪問它的變量,打印出來以便控制檯驗證。最終,我想用這個gameState做的事情就是正確顯示板子,爲此我需要做一些事情,比如訪問棋子的位置,然後在屏幕上正確顯示它們。

謝謝!

回答

32

您可以直接將gameState變量注入JavaScript頁面。

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

另一種選擇可能是使一個AJAX調用回服務器一旦頁面已經加載,返回遊戲狀態JSON,並設置clientGameState以JSON響應。

您還可能有興趣在此:How can I share code between Node.js and the browser?

+1

我決定用AJAX調用滾一旦頁面已經加載。上面的代碼的問題是<%= gameState%>的計算結果爲[對象對象],這根本不是我想要的。謝謝! –

+0

我在我的所有頁面的底部使用<%include script%>,這些頁面有一些標準的東西傳遞給它,比如請求對象,用戶對象,表單錯誤。 – chovy

+8

如果代碼評估爲[object Object],我建議使用'JSON.stringify(game.gameState)'服務器端。 然後將字符串化的對象放入腳本標記中。由於ejs渲染通常會爲HTML轉義特殊字符,因此您需要在腳本標記中使用'var clientGameState = <% - gameState%>' (而不是'<%=') 如果您需要gameState進行渲染你可以做一個JSON.parse()來遍歷它。 – Matthias

4

我覺得下面的邏輯是更好的,它爲我工作。

假設傳遞給ejs頁面的變量是uid,那麼可以將div標記的內容或h標記的內容與傳遞的變量一起使用。您可以訪問腳本中div或h標記的內容,並將其分配給一個變量。下面

代碼示例:(在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

與上面的代碼,你可以很容易地看到整個UID對象,當你做查看源代碼。即使它有效,這也不是正確的做法 – vardha