2012-06-22 115 views
18

Tengo un objeto bastante grande que necesito pasar a una función en un script de cliente. He intentado utilizar JSON.stringify, pero me he encontrado con algunos problemas con este enfoque, principalmente relacionados con el rendimiento. ¿Es posible hacer algo como esto en ejs?¿Pasar un objeto al cliente en node/express + ejs?

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

Y en mi script de cliente, que pasaría este objeto a una función como tal

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

Cuando intento esto me sale bien

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

o

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

'JSON.stringify' es la única manera. –

Respuesta

8

Ese es el comportamiento esperado. El motor de la plantilla está intentando crear una cadena de su objeto que conduce a [Objeto objeto]. Si realmente quieres pasar datos como ese, creo que hiciste lo correcto al codificar el objeto.

+1

'JSON.stringify (someLargeObj)' – alessioalex

48

En Node.js:

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

En EJS:

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

¿Podría decirme la diferencia entre '<% -' y '<% ='? ¿Y por qué no ';' al final? – gr3g

+11

'<%= x %>' interpola el valor de x directamente y '<%-x%>' también HTML-se escapa, por lo que los caracteres como '<' and '>' no son consumidos por el analizador HTML. – prototype

+1

En el punto y coma de Javascript, los puntos y comas son opcionales, pero probablemente sea mejor incluirlos. – prototype

-1

que hay una manera mucho mejor cuando pasa un objeto a los ejs, usted no tiene que hacer frente a JSON. Los métodos stringfy y JSON.parse, son un poco complicados y confusos. En su lugar se puede utilizar el bucle en el que viajar las llaves de sus objetos, por ejemplo:

si tiene un objeto como tal jerarquía

{ 
    "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" 
      } 
     ] 
    } 
} 

En el lado EJS puede yourObject bucle como éste;

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

Para este ejemplo [clave] puede tomar 'índice', 'casa' y 'sobre' los valores y la subclave puede ser cualquiera de sus hijos como 'url', 'path_to_layout', 'path_to_data'

1

Si usa plantillas, sería mucho mejor obtener los valores en la plantilla, por ejemplo, si el usuario inició sesión o no. Puede obtener el envío de datos locales usando

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

Desde el código del lado del servidor, está enviando datos de usuario.

res.render('profile', { 
    user: user.loggedin, 
    title: "Title of page" 
}); 
Cuestiones relacionadas