调用sails.renderView

时间:2015-10-06 05:19:14

标签: node.js sails.js 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中的render函数,看起来要使用的布局文件可以在options对象中传递,但是当我这样做时,没有返回任何视图。

1 个答案:

答案 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模板。 我还没有测试过这个,所以让我知道它是怎么回事