Подтвердить что ты не робот

Частицы с Node.js + Express + Hogan.js

Я разрабатываю сайт с 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.

У меня есть два вопроса:

  • Как правильно использовать частичные части на моих страницах? (этот код не работает)
  • Можно ли использовать один и тот же "заголовок" для двух или более страниц без повторения присвоения значений в файле /routes/index.js?

С уважением, Vi.

4b9b3361

Ответ 1

Я нашел решение для первого вопроса.

Прежде всего, я удалил 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.html, part.html. Файл part.html содержит:

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

Файл index.html содержит:

{{> part}}
Hello world!

Итак, он отлично работает.

Ответ 2

По крайней мере, в Express 4+ частичные просто работают из коробки. Вы можете использовать экспресс-генератор (от npm) с опцией -hogan или -H.

После этого вам нужно добавить частичные методы рендеринга:

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 в представлениях

Ответ 3

Чтобы использовать частичные выражения с выражением + 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>

Обратите внимание на тройку '{' вместо double, как вы обычно делаете! Это говорит, что хоган (усы) анализирует это как HTML, а не строку!

Что это.

Ответ 4

Что касается вашего вопроса о частицах, если вы используете consolidate.js, вы можете просто сделать:

res.render('index', {
  partials: {
    part  : 'path/to/part'
  }
});

Ответ 5

Это проблема. Частичная поддержка трудно найти в Express 3.

Ваш лучший выбор: https://github.com/visionmedia/consolidate.js npm install consolidate

Эти патчи используют разные подходы к добавлению партитур для Hogan:

К сожалению, у двигателя нет крючка для частичных элементов, основанных на файловой системе, поэтому я думаю, что люди путаются о том, как и где должны выполняться частичные действия. Я закончил реализацию LinkedIn Dust.js, поскольку частичная поддержка уже была там. У мастера действительно есть еще лучшая поддержка, плюс я вчера опубликовал патч для относительных путей.

Джош

Ответ 6

Я использовал бы mmm вместо hjs.

https://github.com/techhead/mmm

Отказ от ответственности: я написал пакет.

Просто замените все вхождения hjs на mmm, и частичные начнут работать. Существует более подробная информация и пример по ссылке выше.

Что касается вашего другого вопроса, если вы хотите делиться свойствами нескольких просмотров, у вас есть несколько вариантов.

Когда вы вызываете res.render(name, options), options фактически будет объединен с res.locals и app.locals перед передачей движку рендеринга. Поэтому, чтобы установить свойство app-wide, вы можете просто назначить его app.locals.

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

Эта концепция действительно применима практически к любому движку Express 3 View.

Однако для mmm в частности, см. раздел "Представление логики" для получения дополнительных способов привязки значений к шаблону или набору шаблонов.