玉模板中的异步调用

时间:2014-10-18 05:58:32

标签: javascript node.js express pug

我的网络应用程序有一个主玉模板,其中包含需要在应用程序的每个页面上加载的所有主要组件。其中一个组件是导航栏,我将其拆分为另一个模板。此导航栏的下拉列表需要从数据库动态填充。

我遇到的问题是我想在导航栏被渲染时填充下拉列表。因为我使用了带有nodeJS的express 4.0,所以我想到了使用一个辅助函数,它可以直接从导航栏模板中填充列表。因为此函数是异步的,导航栏会在从数据库中检索下拉项之前呈现自己。

我还想过在页面加载时使用AJAX来填充它,甚至只是事先将下拉项目传递给模板,但我不想在每个res.render上传递这个列表()打电话给我的控制器。

这样做的最佳方式是什么?

样本模板

master.jade:

doctype html
html(lang=en)
head
    block title
body
    #header
        include navbar
        block headerContent
    #content
        block content

navbar.jade:

... //nav code

li(class='dropdown')
  a(href='#', class='dropdown-toggle', data-toggle='dropdown') List
    span(class='caret')
      ul(class='dropdown-menu', role='menu')
        li
          each val, index in list
            a(href='#') val

系统中的典型页面只会扩展主模板并填写相应的标题和内容块。

谢谢!

编辑:

添加样本控制器以显示渲染调用

sampleController.js:

...some error checking
model.save(function(err, results) {
   if (err)
      res.render('view', {error: 'some error'})
   else
      res.render('view', {data: *formatted results obj*})

数据特别与应在此特定视图上呈现的内容相关,而不一定与主数据库所需的内容相关。我也不想传递导航栏项目。

1 个答案:

答案 0 :(得分:3)

AJAX对于导航栏似乎不切实际。

您可以使用中间件填充本地对象

app.use(function(req,res,next){
    res.locals.list = [...];
    // or 
    app.locals.list = [...];
    next();
});