2012-06-22 127 views
18

我有一個很大的對象,我需要傳遞給客戶端腳本中的函數。我嘗試過使用JSON.stringify,但遇到這種方法的幾個問題 - 主要是性能相關。在ejs中可以做這樣的事嗎?在node/express + ejs中將對象傳遞給客戶端?

app.get('/load', function(req, res) { 
    var data = { 
     layout:'interview/load', 
     locals: { 
      interview: '', 
      data: someLargeObj 
     } 
    }; 
    res.render('load', data); 
}); 

而在我的客戶端腳本,我會當我嘗試這個這個對象傳遞給一個函數,像這樣

<script type="text/javascript"> 
    load(<%- data %>); // load is a function in a client script 
</script> 

我得到任何

<script type="text/javascript"> 
    load(); 
</script> 

<script type="text/javascript"> 
    load([Object object]); 
</script> 
+0

'JSON.stringify'是唯一的方法。 –

回答

8

這是預期的行爲。您的模板引擎正在嘗試從您的對象中創建一個字符串,該字符串會導致[Object object]。如果你真的想傳遞這樣的數據,我認爲你通過對對象進行字符串化來做正確的事情。

+1

'JSON.stringify(someLargeObj)' – alessioalex

48

在Node.js的:

res.render('mytemplate', {data: myobject});

在EJS:

<script type='text/javascript'> 
    var rows =<%-JSON.stringify(data)%> 
</script> 
+3

你能告訴我''% - '和'<%='之間的區別嗎?爲什麼沒有';'在最後? – gr3g

+11

'<%= x %>'直接插值x的值,'<%-x%>'也HTML轉義它,所以像'<' and '>'這樣的字符不會被HTML解析器使用。 – prototype

+1

在Javascript終端分號是可選的,但可能包括更好,但包括。 – prototype

-1

想傳遞一個對象到EJS時,有一個更好的方法,你不必處理JSON。 stringfy和JSON.parse方法,這些都有點棘手和混亂。相反,你可以在循環使用的旅行你的對象的鍵,例如:

,如果你有一個像這樣的層次

{ 
    "index": { 
     "url": "/", 
     "path_to_layout": "views/index.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "default" 
      } 
     ] 
    }, 
    "home": { 
     "url": "/home", 
     "path_to_layout": "views/home/index.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "home" 
      } 
     ] 
    }, 
    "about": { 
     "url": "/about", 
     "path_to_layout": "views/default.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "about" 
      } 
     ] 
    } 
} 

對象在EJS側可以循環yourObject這樣;

<% if (locals.yourObject) { %> 
    <% for(key in yourObject) { %> 
    <% if(yourObject.hasOwnProperty(key)) { %> 
     <div> <a class="pagelist" href="<%= yourObject[key]['subkey'] %>"><%= key %></a></div> 
    <% } %> 
    <% } %> 
<% } %> 

在這個例子中[鍵]可採取「索引」,「家」和「關於」價值觀和子項可以是任何它的孩子,如「網址」,「path_to_layout」,「path_to_data」

1

如果您使用的是模板,那麼獲取模板中的值會更好,例如用戶是否登錄。您可以使用發送本地數據

<script> 
    window.user = <%- JSON.stringify(user || null) %> 
</script> 

從服務器端代碼,您正在發送用戶數據。

res.render('profile', { 
    user: user.loggedin, 
    title: "Title of page" 
}); 
相關問題