2013-12-06 3 views
1

Я хочу получить доступ к переменной на клиентском javascript, through jade, переданном по адресу form the server (node).Не удается передать вложенный объект в res.render()?

Так что я сделать вложенный объект:

var clientData = 
    {clientData:{ 
    title: 'Title', 
    body: "body", 
    appadress: 'localhost' || req.host, 
    socketport: socketport, 
    } } 

затем передать этот объект нефритом (via res.render) ..

app.get('/', function(req, res){ 
    clientData.clientData.appadress = req.host; 
    res.render('index.jade', clientData)}); 

который в нефрита recieves как .. (я считаю)

clientData:{ 
    title: 'Title', 
    body: "body", 
    appadress: 'localhost' || req.host, 
    socketport: socketport, 
    } 

Тогда я мог бы передать это на клиентский javascript как объект.

script. 
    var clientData = #{clientData} 

Но это не работает.

res.render() Не принимать вложенные объекты, как это или что-то еще, проблема?

ответ

4

Вы не можете визуализировать объекты с помощью #{...}, потому что это строит объект (похоже на это: {}.toString(), что дает [object Object]).

Вместо этого вам нужно преобразовать переменную в JSON первой, и убедитесь, что Джейд не избежать выхода:

var clientData = !{ JSON.stringify(clientData) }; 

EDIT: вот простой автономный тест (но будет применяться одни и те же принципы, с помощью Джейд через Express):

// app.jade 
var jade = require('jade'); 

jade.renderFile('test.jade', { 
    filename : 'test.jade', // These two properties are only for `renderFile`, 
    pretty : true,  // you don't need to include them with`res.render` 
    clientData:{ 
    title  : 'Title', 
    body  : 'body', 
    appadress : 'localhost', 
    socketport: 8888, 
    } 
}, function(err, html) { 
    if (err) throw err; 
    console.log(html); 
}); 

// test.jade 
!!! 
html 
    head 
    script. 
     var clientData = !{ JSON.stringify(clientData) }; 
    body 
    h1 Hello World 

// Output: 
<!DOCTYPE html> 
<html> 
    <head> 
    <script>var clientData = {"title":"Title","body":"body","appadress":"localhost","socketport":1234};</script> 
    </head> 
    <body> 
    <h1>Hello World</h1> 
    </body> 
</html> 

и я только заметил, что вы, кажется, использует clientData в качестве общей переменной, и установить только clientData.clientData.appadress от каждого запроса. Это вызовет проблемы, так как переменная clientData будет использоваться для всех запросов, и один запрос может перезаписать свойство appaddress так же, как другой запрос будет отображать шаблон (показывая переписанное свойство).

+0

Спасибо за понимание. Но я не могу заставить это работать либо. Во-первых, с '! {}' Он дает ошибку «неожиданного маркера». '. (Кстати, что это делает?) Поэтому я должен опустить его 'clientData = JSON.stringify (clientData);'. А во-вторых, даже после передачи переменной после JSONifying, простой 'div = clientData' в нефрите ничего не выводит. Могу ли я, пожалуйста, беспокоить вас, чтобы опубликовать код более полного кода с кодом в jade-стороне? – laggingreflex

+0

@laggingreflex Я обновил свой ответ, чтобы привести пример (и я также замечаю потенциальную ошибку в вашем коде) – robertklep

Смежные вопросы