【问题标题】:async call in jade template玉模板中的异步调用
【发布时间】:2014-12-13 17:30:48
【问题描述】:

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

我遇到的问题是我想在呈现导航栏时填充下拉列表。因为我在 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*})

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

【问题讨论】:

  • 每个用户的导航栏是否不同?是否取决于某些状态?
  • 显示你的服务器上的渲染调用和你传递的变量。
  • @bebraw 现在每个用户都使用相同的导航栏。我还没有合并会话或任何东西。
  • @ravi 更新了问题以显示示例渲染调用
  • @hebime 然后使用下面的解决方案,如果您有疑问,请使用 Express 中的 Google 中间件处理程序。

标签: javascript node.js express pug


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 2022-12-07
    • 2023-04-03
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    相关资源
    最近更新 更多