Как показать представление внутри представления node.js - PullRequest
0 голосов
/ 14 января 2019

У меня есть вид, маршрут и контроллер для моей приборной панели. У меня также есть маршрут, вид и контроллер для виджетов. На приборной панели я хочу показать эти виджеты. Если я перейду к localhost: 3000 / widget , я действительно смогу увидеть, как данные извлекаются из базы данных, и все это работает. Но в моем представлении панели управления, если я попытаюсь включить его как:

<%- include('../widget/widget.ejs') %>

Тогда никакие данные не отображаются вообще, и я не вижу никаких ошибок в консоли. Как правильно это сделать?

Вот виджет маршрута:

router.get('/widget', isAuth, widgetController.getIndex);

Контроллер виджетов:

const Product = require("../models/product");

exports.getIndex = (req, res, next) => {
 Product.find({ "requests.userId": req.user }, {title: 1})
    .then(product => {
      res.render("widget/widget", {
        path: "/widget",
        product: product
      });
    })
    .catch(err => {
      console.log(err);
    });
};

Виджет:

            <% for (const products of product) { %>
            <li><i class="list-box-icon sl sl-icon-doc"></i>
                <strong><%= products.title %></strong>
            </li>
            <% } %>

Маршрут панели управления:

router.get('/dashboard', accountController.getDashboard);

Контроллер панели инструментов содержит довольно много кода, поэтому я просто сократил его до простейшего вида.

exports.getDashboard = (req, res, next) => {
  if (req.user._id == '5d57abbd24e21t41u56c1t66') {
    Product.find({ status: "pending" })
    .sort({ createdAt: -1 })
    .then(products => {
      res.render("account/dashboard", {
        pageTitle: "Dashboard",
        path: "/dashboard",
        products: products
      });
    })
    .catch(err => {
      const error = new Error(err);
      error.httpStatusCode = 500;
      return next(error);
    });

1 Ответ

0 голосов
/ 14 января 2019

Правильно, поэтому проблема, с которой вы сталкиваетесь, заключается в том, что при маршруте виджета вы извлекаете данные из базы данных, а затем визуализируете их в компонент ejs. В виде панели управления директива include просто отображает HTML из шаблона ejs, данные для заполнения отсутствуют.

У вас есть несколько вариантов. Самым простым (хотя, возможно, и не самым эффективным) может быть просто выполнить тот же запрос БД на панели инструментов, а затем включить соответствующие данные в локальный объект, который вы отправляете в представление.

Другой распространенный подход, как упомянуто в комментариях, заключается в том, чтобы иметь клиентский запрос через ajax, который вызывает конечную точку виджета и внедряет результат в панель мониторинга в соответствующем месте.

Первый подход облегчает рендеринг панели мониторинга одновременно, а второй - лучший подход для постепенной загрузки виджетов и разделения запросов данных.

...