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!这意味着它是一个非常糟糕的解决方案,因为我可能最终通过加载视图来重写全局变量!
我相信这将是一个艰难的过程,我不希望我的观点默认设置/重置全局变量(谁会?!)
你对此有什么解决方案吗?我已经考虑了几个,但我不喜欢任何:
var关键字,但也为本地变量使用before模式,以避免重置参数:var l_title_popover = typeof title_popover != 'undefined' ? title_popover : ''.这看起来很糟糕,令人困惑.view.title_popover = typeof title_popover != 'undefined' ? title_popover : ''.我希望我的变量是本地的,而不是全局变量,如果我这样做,我将会有一些全局存在于内存中的东西.你会怎么处理?我很好奇,也许有一些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 票证上讨论的:)
编辑 -这篇博客文章似乎提供了一些使用下划线库的替代方案。看起来他们以某种方式将模板包装在布局中(我还没有完全理解这篇文章,但表面上似乎有意义)。
不过我只用过上面的方法。