【问题标题】:What is the best way to pass global config variables to handlebars template?将全局配置变量传递给车把模板的最佳方法是什么?
【发布时间】:2015-04-21 13:51:16
【问题描述】:

我有一个带有 express-handlebars 的 nodejs 应用程序,我想为诸如 CSS 和 Javascript 的“主机”地址之类的东西定义变量,这些东西目前正在导入到我在特定布局中调用 form 的 header.hbs 文件中。

我创建了一个 config.js 文件,其中包含我想要设置的许多变量,并使用以下方法将其导入 app.js:

var config = require('./config.js');

但后来我迷路了。例如,我在想我是否可以做这样的事情:

 <link href="{{config.csshost}}basev1.css" rel="stylesheet" type="text/css" /> 

谁能提供一些指针,除了每次加载模板时都声明这些变量之外,我感到很困惑。

【问题讨论】:

    标签: javascript node.js express handlebars.js


    【解决方案1】:

    您将设置应用程序本地:

    var app = express()
    
    app.locals = {
         config: config,
         templateVar: 'test'
     }
    

    编辑:

    您的路线将如下所示:

    app.get('/', function(req, res) {
      res.render('index', {config: config});
    })
    

    这样做的目的是更新 express 中的 app.locals 变量,使其看起来像这样:

    app.locals = {
       config: config
    }
    

    所有 app.local 变量都可以通过以下方式在您的模板中访问:

    {{config}}
    
    //which is really
    app.locals['config']
    

    因此,在您配置 express 的 app.js 中,您可以这样做:

    var app = express();
    
    app.locals.config = require('./config')
    
    app.get('/', function(req, res) {
      return res.render('index')
    })
    

    【讨论】:

    • 谢谢,但我不确定如何解释上述内容?你能解释一下这是在做什么以及我如何将这些变量注入到布局中?
    • 这就是你所要做的。在渲染模板并传递变量时,所做的只是更新 app.locals,然后将这些传递到您的模板范围。
    • 这很好用。但是对我来说有点混乱。因此,只需使用app.locals.config = require('./config') 就可以在我的车把模板中访问配置对象(通过{{ config.property }})。所以只要看看最后一个代码块;)
    【解决方案2】:

    (这应该是对上面sctskw's answer 的评论,但我没有足够的声誉来这样做。)

    与其用新对象覆盖app.locals,不如向现有对象添加新属性,如下所示:

    app.locals.config = config;
    app.locals.templateVar = 'test';
    

    原因是 Express 在内部使用了app.locals。覆盖它会丢失 Express 提供的一些有用的变量。例如,我们可以使用settings.env来检测视图模板中当前的运行环境,Express定义为app.locals.settings.env

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多