5

私はnodejsでエクスプレスを使用しており、ビューのレンダリングを乾いた状態に保とうとしています。私のレイアウトの中には、次のようなものがあります(私は翡翠を使用しています)

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」をローカルに再入力する必要がないようにする方法はありますか

4

3 に答える 3

9

この答えが遅れていることは知っていますが、後世のために: Express を使用している場合は、提供されている動的ヘルパーを使用する必要があります。これはreq,res、引数として受け取るビュー アクセス可能なヘルパー関数です。あなたの場合:

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

つまり、ビューが呼び出すことができるようになりました#{user}

于 2011-07-22T23:00:00.850 に答える
2

私は最終的に次のことをしました:

まず、いくつかのローカル変数を設定します

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));

もっと良いものがあるかもしれませんが、これが私がこれまでに見つけた最良の解決策です

于 2011-02-17T07:41:04.090 に答える
0

最も簡単な解決策は、ローカル オブジェクトを返す関数を使用することです。

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

res.render('anything.jade',{
  locals: defaultLocals(req)
});
于 2011-01-29T00:15:02.157 に答える