翡翠模板中的异步调用

Hebime

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

我遇到的问题是,我想在导航栏被渲染时填充下拉列表。因为我将Express 4.0与nodeJS一起使用,所以我想到了使用一个助手函数,该函数将从navbar模板中直接填充列表。由于此功能是异步的,因此导航栏会在从数据库中检索下拉项之前先呈现自身。

我还考虑过在页面加载中使用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();
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章