jade模板中的异步调用



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

我遇到的问题是,我想在呈现导航栏时填充下拉列表。因为我在nodeJS中使用express 4.0,所以我想使用一个助手函数,直接从导航栏模板中填充列表。因为这个函数是异步的,所以导航栏会在从DB中检索下拉项之前呈现自己。

我还想过在页面加载中使用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*})

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

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

你可以使用一件中装来填充本地对象

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

最新更新