如何使用{{> partials}使用Consolidate.js&胡子?

时间:2012-12-22 17:47:15

标签: node.js express templating mustache

在使用consolidate.js时,我无法让胡子读取像{{> my_partial}}这样添加的部分内容。我用以下内容开始我的快速申请:

文件index.js:

var express = require('express'),
    cons    = require('consolidate'); 

app.configure(function(){

  app.set( 'models',       BACKEND + '/models' );       // Set the models directory
  app.set( 'views',        BACKEND + '/views' );        // Set the views directory
  app.set( 'controllers',  BACKEND + '/controllers' );  // Set the controllers dir


  app.set( 'view engine',  'html' );                // Set Mustache as the templating engine
  app.engine( 'html', cons.mustache );
  app.engine( 'mustache', cons.mustache );

  app.use( app.router );  // Set the router
  app.use( '/public', express.static( BASEPATH + '/frontend/public' ) );  // set frontend/public to /public for users
  app.use( '/js', express.static( BASEPATH + '/frontend/js' ) );
  app.use( '/out', express.static( BASEPATH + '/out' ) ); // documentation path

  // Set client side libraries here (Make them available to the public based on settings.json)
  for(setting in SETTINGS.public) {
    app.use( SETTINGS.public[setting],  express.static(BASEPATH + SETTINGS.public[setting]) );
  }

});

然后,在控制器的某个地方,我像这样使用渲染:

function Blog(app, request, response){

  var fs      =  require('fs'), 
      Blog    =  require( app.get('models') + '/blog' ),
      model   =  new Blog(),
      scripts =  fs.readFileSync( VIEWS + '/m_scripts.mustache').toString()     ;

  model.List(function(data){

    response.render('layout', 
      {
        title     :  'My Blog',
        body      :  'Hello Mustache World',
        list      :  data.rows,
        cache     :  false,
        partials  : {
          m_scripts : partialStr
        }
      }
    );

  });

};


exports.list = Blog;

m_scripts.mustache具有:

<script data-src="ergierjgoejoij"></script>

布局模板渲染得很好,并且params也很好地通过,部分m_scripts与readFileSync()传递的文本一起传递.toString()就好了但HTML内容被编码并呈现无用。

我的问题是,有没有办法可以放入layout.mustache {{&gt; m_scripts}},而且胡须理解自动加载m_scripts.mustache而无需将其传递给render()。如果没有,我错过了什么?

3 个答案:

答案 0 :(得分:3)

事实证明,此时,consolidate.js不支持partials。有一个拉取请求来修复此问题,但尚未合并:https://github.com/simov/consolidate.js

我最终使用了这个分叉而不是:

1)npm uninstall合并

2)npm install simov / consolidate.js

npm install simov / consolidate.js将安装该分叉版本。然后我可以做以下事情:

/**
 * @module Blog Controller
 */ 
function Blog(app, request, response){

  var Blog    =  require( app.get('models') + '/blog' ),
      model   =  new Blog();

  model.List(function(data){

    response.render('layout', 
      {
        title     :  'My Blog',
        body      :  'Hello Mustache World',
        list      :  data.rows,
        cache     :  false
        ,partials  : {
          m_scripts : './backend/views/m_scripts.html'
        }
      }
    );

  });

};


exports.list = Blog;

这比我想象的要简单得多。您将路径传递给部分,然后您可以在layout.html上使用{{&gt; m_scripts}}

但是,不确定是否有办法实现它,默认情况下,在views文件夹或其他东西上查找{{&gt; m_scripts}}。那会很整洁。

答案 1 :(得分:2)

您可以使用Hogan代替Mustache。 Hogan将使用您在app.set('partials', partialsPathMap)中设置的部分作为路径图来渲染模板。

您可以在项目中使用此gist:5149597中的代码。然后在渲染模板时不需要任何更多的部分配置。


编辑2014-06-23:

为了更简单,我写了一个npm来处理这个问题。只需npm install mustlayout,存储库和文档就在这里:https://github.com/mytharcher/mustlayout

答案 2 :(得分:0)

我偶然发现了这个话题,因为我想知道Consolidate如何与partials一起工作,并发现Consolidate现在可以正常使用partial。

  1. 创建一个views文件夹并创建一个名为index.hbs
  2. 的文件
  3. 在HTML
  4. 中的某处添加行{{&gt; menuPartial}}
  5. 创建一个名为partials
  6. 的视图子结构
  7. 创建一个名为menu.hbs的文件
  8. 然后,您可以使用此Node脚本进行部分工作:

    const express = require('express');
    const engines = require('consolidate');
    
    
    const app = express();
    app.engine('hbs', engines.handlebars);
    app.set('views', './views');
    app.set('view engine', 'hbs');
    
    app.get('/', (request, response) => {
        response.render('index', { partials : { menuPartial : './partials/menu'} });
    });
    
    exports.app = functions.https.onRequest(app);