Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 模板中的全局变量_Javascript_Backbone.js_Ejs - Fatal编程技术网

Javascript 模板中的全局变量

Javascript 模板中的全局变量,javascript,backbone.js,ejs,Javascript,Backbone.js,Ejs,我有一个EJS模板,它代表我的web应用程序的头。我试图访问我在前端主干应用程序中定义的全局变量,但由于某种原因,我得到一个错误,即“appGlobal未定义”。前端JavaScript中的全局变量如下所示: appGlobal = { authorized: null, currentUser: null, env: null }; 模板如下所示: <header> <div> <

我有一个EJS模板,它代表我的web应用程序的头。我试图访问我在前端主干应用程序中定义的全局变量,但由于某种原因,我得到一个错误,即“appGlobal未定义”。前端JavaScript中的全局变量如下所示:

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没有在模板中定义的原因
    是因为模板呈现为服务器端而不是客户端; appGlobal是一个客户端全局
  • 然而,这段代码仍然应该检查是否定义了appGlobal,所以我不明白它为什么会抛出错误
  • 如果我将模板更改为使用window.appGlobal,则窗口不可用 定义为
  • 因此,看起来模板确实是呈现在服务器端的——移动模板以呈现客户端的最佳方式是什么?头模板包含在index.ejs文件中,如下所示:

    <% 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是一个客户端全局
  • 那完全正确;服务器不会以任何方式解析发送到浏览器的任何代码(HTML、CSS、JS):服务器只将该代码视为文本。编译服务器端模板时,将在浏览器中运行的任何JavaScript都尚未运行

  • 然而,这段代码仍然应该检查是否定义了appGlobal,所以我不明白它为什么会抛出错误
  • 是的,但是没有在服务器上定义
    appGlobal
    ,因为代码没有在服务器上运行。它只在客户端上运行

  • 如果我将模板更改为使用window.appGlobal,则也不会定义window
  • 因为同样的原因,它没有被定义

    一种可能的解决方案是在服务器上安装
    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是一个客户端全局
  • 那完全正确;服务器不会以任何方式解析发送到浏览器的任何代码(HTML、CSS、JS):服务器只将该代码视为文本。编译服务器端模板时,将在浏览器中运行的任何JavaScript都尚未运行

  • 然而,这段代码仍然应该检查是否定义了appGlobal,所以我不明白它为什么会抛出错误
  • 是的,但是没有在服务器上定义
    appGlobal
    ,因为代码没有在服务器上运行。它只在客户端上运行

  • 如果我将模板更改为使用window.appGlobal,则也不会定义window
  • 因为同样的原因,它没有被定义

    一种可能的解决方案是在服务器上安装
    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=;
    
    请注意,对于未扫描的输出,使用了
    分隔符

    重要的是要认识到,这意味着客户最初将获得