我正在使用sails辅助方法sails.renderView
将视图呈现为一个字符串,然后在电子邮件中使用,如下所示:
sails.renderView('emails/booking', emailData, function (err, view) {
emailService.send(user.email, view);
});
以这种方式渲染视图时是否可以指定布局文件?我正在使用ejs模板引擎。
看起来我不能使用视图配置(config/views.js
),因为它是基于路线的。
我查看了sails/lib/hooks/views/render.js
中的render函数,看起来要使用的布局文件可以在options对象中传递,但是当我这样做时,没有返回任何视图。
答案 0 :(得分:3)
编辑:抱歉,我错过了这是在常规请求/响应上下文之外生成的。答案改为反映出来。
我捅了一下风帆代码,特别是the render engine
/**
* sails.hooks.views.render(relPathToView, options, cb_view)
*
* @param {String} relPathToView
* -> path to the view file to load (minus the file extension)
* relative to the app's `views` directory
* @param {Object} options
* -> options hash to pass to template renderer, including locals and locale
* @param {Function} cb_view(err)
* -> called when the view rendering is complete (response is already sent, or in the process)
* (probably should be @api private)
* @api public
*/
... lots of code ...
// if local `layout` is set to true or unspecified
// fall back to global config
var layout = options.layout;
if (layout === undefined || layout === true) {
layout = sails.config.views.layout;
}
事实证明,您可以将布局设置为传递到sails.renderView()
因此,如果您有一个电子邮件模板emailLayout.ejs
,您可以通过将此行添加到您的控制器来使用它,如下所示:
emailData.layout = '/emailLayout';
sails.renderView('emails/booking', emailData, function (err, view) {
emailService.send(user.email, view);
});
值得注意的是,这明确仅适用于ejs
模板。
我还没有测试过这个,所以让我知道它是怎么回事