与EJS斗争和-not-"局部"变量的范围

Vad*_*est 5 javascript scope ejs node.js

我想知道如何使用EJS模板编写我的node.js应用程序.我实际上正在寻找一种在部分/模板中使用默认值定义局部变量的正确方法.

我很快就会知道它现在有效:

当我调用模板时,像这样:

<%- partial(__view.partialPath('tagPopover'), {
    title_popover: sentence.nickname,
    content_tag: '#' + sentence.nickname,
    icon_popover: 'http://placehold.it/64x64'
}) %>
Run Code Online (Sandbox Code Playgroud)

我以这种方式管理默认值,在_tagPopover.ejspartial中:

title_popover = typeof title_popover != 'undefined' ? title_popover : ''
classes_tag = typeof classes_tag != 'undefined' ? classes_tag : 'tags'
icon_popover = typeof icon_popover != 'undefined' ? icon_popover : false
content_tag = typeof content_tag != 'undefined' ? content_tag : ''
Run Code Online (Sandbox Code Playgroud)

我不使用var关键字,因为它根本不起作用,例如,如果我这样做:

var title_popover = typeof title_popover != 'undefined' ? title_popover : ''
Run Code Online (Sandbox Code Playgroud)

然后EJS会插入var title_popover并创建一个局部变量,然后再读取变量的实际值title_popover.所以我最终会得到一个null,即使我实际发送了一个参数......

当我发现这一点时,我决定不使用var关键字...但我最近才发现我用这种方式创建的所有变量实际上都是global!这意味着它是一个非常糟糕的解决方案,因为我可能最终通过加载视图来重写全局变量!

我相信这将是一个艰难的过程,我不希望我的观点默认设置/重置全局变量(谁会?!)

你对此有什么解决方案吗?我已经考虑了几个,但我不喜欢任何:

  1. 使用var关键字,但也为本地变量使用before模式,以避免重置参数:var l_title_popover = typeof title_popover != 'undefined' ? title_popover : ''.这看起来很糟糕,令人困惑.
  2. 使用像view.title_popover = typeof title_popover != 'undefined' ? title_popover : ''.我希望我的变量是本地的,而不是全局变量,如果我这样做,我将会有一些全局存在于内存中的东西.

你会怎么处理?我很好奇,也许有一些EJS方式来处理或帮助我,我不知道.

Jus*_*aat 3

ejs中有一个过滤器的概念。另请参阅添加过滤器

基本上我认为你正在寻找与此类似的东西。如果 res.locals 中存在,下面的代码将设置 title_popover,否则它设置为“某个默认值”

<%=: locals | get:'title_popover','some default value' %>  

ejs.filters.get = function(obj, prop, default) {
  return obj[prop] === undefined ? default : obj[prop];
};  
Run Code Online (Sandbox Code Playgroud)

我相信这是在 ejs 中最简单的方法,但可能还有其他方法。看起来这实际上是在 github 票证上讨论的:)

编辑 -这篇博客文章似乎提供了一些使用下划线库的替代方案。看起来他们以某种方式将模板包装在布局中(我还没有完全理解这篇文章,但表面上似乎有意义)。

不过我只用过上面的方法。