Javascript 模板中的全局变量
我有一个EJS模板,它代表我的web应用程序的头。我试图访问我在前端主干应用程序中定义的全局变量,但由于某种原因,我得到一个错误,即“appGlobal未定义”。前端JavaScript中的全局变量如下所示:Javascript 模板中的全局变量,javascript,backbone.js,ejs,Javascript,Backbone.js,Ejs,我有一个EJS模板,它代表我的web应用程序的头。我试图访问我在前端主干应用程序中定义的全局变量,但由于某种原因,我得到一个错误,即“appGlobal未定义”。前端JavaScript中的全局变量如下所示: appGlobal = { authorized: null, currentUser: null, env: null }; 模板如下所示: <header> <div> <
appGlobal = {
authorized: null,
currentUser: null,
env: null
};
模板如下所示:
<header>
<div>
<div id="header-div-id">
<% if(appGlobal && appGlobal.currentUser != null) { %>
<div>Logged In As: <%= appGlobal.currentUser%></div>
<button id="logout-button-id">Logout</button>
<% } else { %>
<div>You need to either register or login.</div>
<% } %>
</div>
</div>
</header>
以以下身份登录:
注销
您需要注册或登录。
是因为模板呈现为服务器端而不是客户端; appGlobal是一个客户端全局李>
<% include ./partials/header %>
<main>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<div name="main-div" id="main-div-id">
</div>
</main>
<% include ./partials/footer %>
欢迎来到
您使用的模板系统(EJS)是在服务器端执行的,对与客户端代码相关的语义一无所知
在这种情况下,
appGlobal
变量声明永远不会由EJS
计算,因此无法通过服务器端作用域访问。您正在使用的模板系统(EJS)是在服务器端执行的,对与客户端代码相关联的语义一无所知
在这种情况下,appGlobal
变量声明从不由EJS
计算,因此无法通过服务器端作用域访问
appGlobal
,因为代码没有在服务器上运行。它只在客户端上运行
appGlobal
变量,然后使用EJS将其添加到客户端代码中。例如,在服务器代码的某个地方,您可能有如下内容:
ejs.render(templateStr, { data: 'here' });
ejs.render(templateStr, {
appGlobal: appGlobal,
appGlobalStr: JSON.stringify(appGlobal)
});
<script>
var appGlobal = <%- appGlobalStr %>;
</script>
(如果您使用的是像Express这样的库,这可能看起来有点不同。)
如果在服务器上创建appGlobal
,则可以将其作为参数添加到数据对象中,并在模板中根据您的问题使用它:
var appGlobal = {
authorized: null,
currentUser: null,
env: null
};
ejs.render(templateStr, { appGlobal: appGlobal });
但是,如果您想让这个变量在客户端可用,您可以对它进行字符串化并将其添加到模板中。所以JavaScript看起来像这样:
ejs.render(templateStr, { data: 'here' });
ejs.render(templateStr, {
appGlobal: appGlobal,
appGlobalStr: JSON.stringify(appGlobal)
});
<script>
var appGlobal = <%- appGlobalStr %>;
</script>
然后在模板中,您可以执行以下操作:
ejs.render(templateStr, { data: 'here' });
ejs.render(templateStr, {
appGlobal: appGlobal,
appGlobalStr: JSON.stringify(appGlobal)
});
<script>
var appGlobal = <%- appGlobalStr %>;
</script>
var-appGlobal=;
请注意,对于未扫描的输出,使用了
分隔符
重要的是要认识到这意味着客户端最初将获得服务器的appGlobal
变量的当前值,但它们根本不保持“同步”。另外,请确保您同意客户端可以访问appGlobal
对象的所有属性。例如,如果您正在对用户记录执行类似的操作,您肯定不想将密码哈希
(可能还有许多其他属性)发送到客户端
appGlobal
,因为代码没有在服务器上运行。它只在客户端上运行
appGlobal
变量,然后使用EJS将其添加到客户端代码中。例如,在服务器代码的某个地方,您可能有如下内容:
ejs.render(templateStr, { data: 'here' });
ejs.render(templateStr, {
appGlobal: appGlobal,
appGlobalStr: JSON.stringify(appGlobal)
});
<script>
var appGlobal = <%- appGlobalStr %>;
</script>
(如果您使用的是像Express这样的库,这可能看起来有点不同。)
如果在服务器上创建appGlobal
,则可以将其作为参数添加到数据对象中,并在模板中根据您的问题使用它:
var appGlobal = {
authorized: null,
currentUser: null,
env: null
};
ejs.render(templateStr, { appGlobal: appGlobal });
但是,如果您想让这个变量在客户端可用,您可以对它进行字符串化并将其添加到模板中。所以JavaScript看起来像这样:
ejs.render(templateStr, { data: 'here' });
ejs.render(templateStr, {
appGlobal: appGlobal,
appGlobalStr: JSON.stringify(appGlobal)
});
<script>
var appGlobal = <%- appGlobalStr %>;
</script>
然后在模板中,您可以执行以下操作:
ejs.render(templateStr, { data: 'here' });
ejs.render(templateStr, {
appGlobal: appGlobal,
appGlobalStr: JSON.stringify(appGlobal)
});
<script>
var appGlobal = <%- appGlobalStr %>;
</script>
var-appGlobal=;
请注意,对于未扫描的输出,使用了
分隔符
重要的是要认识到,这意味着客户最初将获得