在使用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()。如果没有,我错过了什么?
答案 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。
然后,您可以使用此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);