2016-01-12 9 views
3

После того, как я установил глобальную переменную в экспресс, используяГлобальная переменная в Marko JS Шаблон и Экспресс

app.use(function(req, res, next){ 
    res.locals.isAuthenticated = true; 
    next(); 
}); 

Как я могу получить эту переменную внутри любого представления (* .marko шаблон)?

Я знаю, что в Jade вы должны иметь доступ к нему напрямую, как и любая другая переменная, без необходимости передавать его с родительского шаблона. Что эквивалентно в Marko JS?

Благодаря

ответ

6

С Marko вы обычно хотите bypass the Express view engine и сделать шаблон непосредственно на записываемый res потока:

var template = require('./template.marko'); 

app.use(function(req, res){ 
    var templateData = { ... }; 
    template.render(templateData, res); 
}); 

С таким подходом вы имеете полный контроль над тем, что данные передаются в шаблон. Технически, у вас есть доступ к res.locals в шаблоне, выполнив следующие действия:

<div if="out.stream.locals.isAuthenticated"> 

ПРИМЕЧАНИЕ: out.stream просто ссылка на записываемый поток, который записывается на (в данном случае, res)

You есть другие варианты:

Использование res.locals в качестве данных шаблона

var template = require('./template.marko'); 

app.use(function(req, res){ 
    var templateData = res.locals; 
    template.render(templateData, res); 
}); 

шаблон Построить данные res.locals

var template = require('./template.marko'); 

app.use(function(req, res){ 
    var templateData = { 
    isAuthenticated: res.locals.isAuthenticated 
    }; 
    template.render(templateData, res); 
}); 

Марко также поддерживает "глобальные" данные, которые доступны с помощью out.global. См .: http://markojs.com/docs/marko/language-guide/#global-properties

Если у вас есть вопросы, пожалуйста, поделитесь!

+0

Спасибо @Patrick Steele-Idem, единственное, что мне пришлось сделать, помимо кода, который я написал на моем посту, было проверить переменную с помощью 'if =" out.stream.locals.isAuthenticated ", как вы сказали. Больше ничего! Таким образом, мне не нужно передавать переменную непосредственно в шаблон, как другие примеры, которые вы предложили. Как насчет 'app.locals'? Как я могу связаться с ними? – crash

+0

Эй, @crash, экземпляр 'app' зависает от' res' и 'req' как' res.app' и 'req.app', соответственно, поэтому вы можете получить доступ к' app.locals' как 'out.stream. app.locals'. –

+0

Для таких людей, как я, которые пришли сюда и нашли мертвую ссылку: , мы можем получить доступ к req, res, app, app.locals и res.locals автоматически out.global в любом представлении, используя res.marko вместо template.render с экспресс. См. Https://markojs.com/docs/express/#usage – ElJackiste