调用 sails.renderView 时在 Sails.js 中指定布局文件
Specifying a layout file in Sails.js when calling sails.renderView
我正在使用 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
中的渲染函数,看起来要使用的布局文件可以在选项对象中传递,但是当我这样做时,没有返回任何视图。
编辑:抱歉,我错过了这是在常规 request/response 上下文之外生成的。答案已更改以反映这一点。
我浏览了 sails 代码,特别是 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
模板。
我还没有测试过这个,所以让我知道它是怎么回事
我正在使用 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
中的渲染函数,看起来要使用的布局文件可以在选项对象中传递,但是当我这样做时,没有返回任何视图。
编辑:抱歉,我错过了这是在常规 request/response 上下文之外生成的。答案已更改以反映这一点。
我浏览了 sails 代码,特别是 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
模板。
我还没有测试过这个,所以让我知道它是怎么回事