在Keystone js中刷新模板

时间:2018-01-08 14:34:24

标签: javascript mongodb mongoose handlebars.js keystonejs

我在keystone中创建了2个模型。一个是CD_Book,第二个是音乐家。我打开CD_Book视图时尝试连接这两个集合。我想要来自cd的显示音乐家,所以我创建了这个查询:

        keystone.list('CD_Book').model.findOne({
            slug: locals.filters.cdbook
        }).exec(function(err, result) {
            locals.data.cdbook = result;
            let musiciansString = result.musicians
            musiciansTab = musiciansString.split(',');
            for (let i = 0; i < musiciansTab.length; i++) {
                keystone.list("Musician").model.findOne({
                    "title": musiciansTab[i].trim()
                }).exec(function(err, result) {
                    locals.data.musicians.push(result);
                    console.log(locals.data.musicians);
                });
            }
            next(err);
        });

它当然是有效的,在console.log中,我得到了我想要的所有音乐家数据,但它没有显示在.hbs模板中。找到所有音乐家后,我应该如何刷新/更新模板?也许这不是实现这一目标的最佳方法(通过使用for循环)

1 个答案:

答案 0 :(得分:1)

您的 findOne 调用是异步的,因此 next()会在完成之前被调用。

因此,您的模板将在 locals.data.musicians 中提供数据之前呈现。

您可以尝试使用查找而非 findOne 一次性获取所有音乐家,然后在检索后将其设置为 locals

完成后,您可以调用 next()继续渲染模板。

尝试这样的事情:

keystone.list('CD_Book').model
  .findOne({ slug: locals.filters.cdbook })
  .exec()
  .then(result => {

    locals.data.cdbook = result

    let musiciansString = result.musicians
    let musiciansTab = musiciansString
      .split(',')
      .map(musician => musician.trim())

    return keystone.list("Musician").model
      .find({ "title": { $in: musiciansTab } })
      .exec()

  })
  .then(result => {

    locals.data.musicians = result
    console.log(locals.data.musicians)
    next()

  })
  .catch(err => {
    next(err)
  })

我希望这会有所帮助。