СУШКА локальных макетов в рендеринге expressjs - PullRequest
5 голосов
/ 28 января 2011

Я использую экспресс в nodejs и пытаюсь сохранить мой вид рендеринга сухим.Внутри моего макета у меня есть что-то вроде следующего (я использую Jade)

body
  nav.login
    -if(currentUser)
      ="logged in information"
    -else
      ="logged out information"
  !=body

Проблема в том, что каждый раз, когда я рендеринг, мне теперь нужно иметь

res.render('anything.jade',{
  locals: {
    currentUser: req.session.currentUser,
    /*all of my other locals*/
  }
});

Кажется, что мне нужно пройти через все мои вызовы рендеринга и добавить это, а затем сделать то же самое, если мне нужно добавить какие-либо другие локальные объекты в макет.Есть ли какой-то способ избежать необходимости повторного ввода 'currentUser' в локальные файлы везде, где я рендерим

Ответы [ 3 ]

9 голосов
/ 23 июля 2011

Я знаю, что этот ответ запоздал, но для потомков: если вы используете экспресс, вы должны использовать поставляемые динамические помощники, которые являются доступными для просмотра вспомогательными функциями, которые принимают req,res в качестве аргументов.В вашем случае:

app.dynamicHelpers({
  user: function(req, res){
    return req.session.currentUser;
  }
});

Это означает, что ваш взгляд теперь может вызывать #{user}

2 голосов
/ 17 февраля 2011

Я закончил тем, что сделал следующее:

сначала я настроил некоторые локальные переменные

app.use(function(req,res,next){
  req.localvars = new Object;
  next();
});

позже я установил некоторые локальные переменные

app.use(function(req,res,next){
  req.localvars.currentUser = req.session.currentUser;
  next();
});

Я настроил функцию рендеринга

function renderer(file){  
  return function(req,res,next){
    res.render(file,{locals:req.localvars});
  }
}

затем для функции маршрутизации

app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade));

Возможно, есть что-то лучше, но это лучшее решение, которое я до сих пор нашел

0 голосов
/ 29 января 2011

Самое простое решение - использовать функцию, которая возвращает объект locals.

function(req) {
    return {
        currentUser: req.session.currentUser,
        /*all of my other locals*/
    };
}

res.render('anything.jade',{
  locals: defaultLocals(req)
});
...