我知道这种愚蠢的问题要问。但是对于初学者和熟悉express nodejs的人来说,这个问题也可能对其他人有用。对我来说,我很熟悉使用Express Node.js用这种方法渲染nunjucks。这是一个我们都知道的例子:
nunjucks.render('index.html', { foo: 'bar' });
我在documentation上使用render(req, name, data)
找到了您的Apostrophe文档。我想自定义光标和覆盖 req.data
,就像在上面使用nunjucks一样。而且我发现this是正确的使用方法,而且我不知道从哪里开始!我应该使用self.beforeShow
吗?我不想在发生GET请求的地方使用self.route
。我只想添加其他数据并将其呈现在show.html
,indexAjax.html
上,或者甚至使用自定义indexCustom.html
来呈现它,类似于上面的Nunjucks示例。我知道如何做游标并通过它来操纵数据。我是一个学习缓慢的人,但我从未停止学习。先感谢您。
P / s:如果你们可以在HOWTO部分发布新的教程,以将此“额外渲染/覆盖数据到页面中”,那将是非常有帮助的!
答案 0 :(得分:1)
要使其他数据可用于页面模板,最简单的方法是监听apostrophe-pages:beforeSend
promise事件(使用Apostrophe 2.63.0或更高版本):
// in app.js
var apos = require('apostrophe')({
shortName: 'myproject',
// among other things
modules: {
'apostrophe-pieces': {}
}
});
// in lib/modules/products/index.js
module.exports = {
extend: 'apostrophe-pieces',
name: 'product',
construct: function(self, options) {
self.on('apostrophe-pages:beforeSend', 'getAllProducts', function(req) {
// Let's assume you have a "products" module that extends pieces
// and you want all of them on every page (not necessarily a good idea)
return self.apos.modules.products.find(req).toArray().then(function(products) {
req.data.products = products;
});
});
}
};
{# In any page template or layout #}
{% for product in data.products %}
{{ product.title }}
{% endfor %}
较旧的方法是实现pageBeforeSend
方法,但这会迫使您使用回调,并且promises绝对是2018年的发展之路。
您没有为用例指定更多的内容,因此我的示例是一种以常规方式扩展片段的方法,但要确保所有片段在每个页面上都可用-这可能是一个好主意或糟糕,取决于您拥有多少,但是它展示了这种技术。