18

Node.js + Express でサイトを開発しており、ビュー エンジンとして Hogan.js を使用しています。

これは私のファイルですapp.js

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'hjs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(app.router);
  app.use(require('less-middleware')({ src: __dirname + '/public' }));
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);
app.get('/about', routes.about);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

ファイル/routes/index.jsは次のとおりです。

/*
 * GET pages.
 */

exports.index = function(req, res){
  res.render(
    'index',
    {
      title: 'Home Page',
      author: 'Bruce Wayne'
    }
  );
};

exports.about = function(req, res){
  res.render(
    'about',
    {
      title: 'About Page',
      author: 'Bruce Wayne'
    }
  );
};

/viewsフォルダには、次のものがあります。

|-part.hjs

|-index.hjs

|-cv.hjs

ファイルpart.hjsは次のとおりです。

<h3>Hello {{ author }}</h3>

ファイルindex.hjsは次のとおりです。

<h1>Title: {{ title }} </h1>
{{> part }}
Welcome to Gotham City.

ファイルabout.hjsは次のとおりです。

<h1>Title: {{ title }}</h1>
{{> part }}
I'm not Joker.

2 つの質問があります。

  1. ページでパーシャルを適切に使用するにはどうすればよいですか? (このコードは機能しません)
  2. ファイルで値の割り当てを繰り返さずに、2 つ以上のページに同じ「タイトル」を使用できます/routes/index.jsか?

よろしく、ヴィ。

4

6 に答える 6

25

最初の質問の解決策を見つけました。

まず、削除しましたhjs

npm remove hjs

次に、パッケージをインストールしましたhogan-express

npm install hogan-express

さらに、私は編集しましたapp.js

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

app.engine('html', require('hogan-express'));
app.enable('view cache');

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'html');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(app.router);
  app.use(require('less-middleware')({ src: __dirname + '/public' }));
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

そしてroutes/index.js

exports.index = function(req, res) {
  res.locals = {
    title: 'Title',
  };
  return res.render(
    'index',
    {
      partials:
      {
        part: 'part',
      }
    }
  );
};

さて、/viewsそこにはindex.htmlpart.html。ファイルには次のものpart.htmlが含まれます。

<h1>{{ title }}</h1>

ファイルには次のものindex.htmlが含まれます。

{{> part}}
Hello world!

だから、それはうまくいきます。

于 2012-10-08T19:36:13.623 に答える
6

少なくとも Express 4+ では、パーシャルはすぐに使用できます。--hogan または -H オプションを指定して Express-generator (npm から) を使用できます。

それを行った後、render メソッドにパーシャルを追加する必要があります。

router.get('/', function(req, res, next) {
  res.render('index', 
        { 
            title: 'My Site',
            partials: {header: 'header'} 
        });
});

次に、テンプレートで {{ > xxx }} を使用します

<body>
  {{> header }}
  <h1>{{ title }}</h1>

  <p>Welcome to {{ title }}</p>
</body>

注: これには、ビューに header.hjs があります

于 2015-09-09T10:14:36.420 に答える
4

Express+Hogan でパーシャルを使用するには、次のようにします。

app.get('/yourRoute', function(req, res){  
   res.render('yourPartial', function(err,html){
       var partialHTML = html;
       res.render('yourMainView', { myPartial: partialHTML }, function(err,html){
          res.send(html);   
       });     
   });
}

そして今、yourMainView.html:

<p>Something Something Something</p>
{{{partialHTML}}}
<p>Bla Bla Bla</p>

通常の 2 重ではなく、3 重の '{' に注意してください。hogan (口ひげ) に、これを文字列ではなく HTML として解析するように指示します!

それでおしまい。

于 2014-06-19T08:41:23.490 に答える
3

パーシャルの質問については、consolidate.jsを使用する場合は、次のように簡単に実行できます。

res.render('index', {
  partials: {
    part  : 'path/to/part'
  }
});
于 2012-12-31T12:20:12.293 に答える
2

mmmの代わりに使用しhjsます。

https://github.com/techhead/mmm

免責事項: 私はパッケージを書きました。

すべての出現箇所をhjswithmmmに置き換えるだけで、パーシャルが機能し始めます。上記のリンクには、さらに多くの情報と例があります。

他の質問については、複数のビューでプロパティを共有したい場合、いくつかのオプションがあります。

を呼び出すと、レンダリング エンジンに渡される前にres.render(name, options)optionsが実際にマージされres.localsます。app.localsしたがって、アプリ全体のプロパティを設定するには、単純に に割り当てることができますapp.locals

app.locals.title = "Default Title"; // Sets the default title for the application

この概念は、ほぼすべての Express 3 View Engine に当てはまります。

ただし、mmm具体的には、値をテンプレートまたはテンプレートのセットにバインドするその他の方法については、プレゼンテーション ロジックのセクションを参照してください。

于 2012-10-13T20:13:50.193 に答える