0

我有这个基本koa v2的应用程序,我尝试在其中将模板文字实现为查看引擎。./views/index.js如何填充fromstate的值app.js

我的问题是我想将对象值从ctx.body = index.render({})一路向下推送到.views/partials/mainTop.js文件,假设我想在标签title之间包含对象值。<title></title>有没有办法在不需要.views/partials/mainTop.jsin的情况下实现这一目标app.js?如果它是把手或 nunjucks 模板,我想用模板文字实现类似的东西。

./app.js

const index = require('./views/index');
const app = new Koa();

app.use(ctx => {
  index.state = {
    foo: 'bar',
  };
  ctx.body = index.render({
    title: 'Template Literals',
    description: 'Vanilla JS rendering',
  });
});

app.listen(3000);

./views/index.js

const main = require('./layouts/main');

let state = {};
module.exports.state = state;
console.log(state); // returning an {} empty object, expected => { foo: "bar" }

module.exports.render = (obj) => {
  return main.render(`
    <p>Hello world! This is HTML5 Boilerplate.</p>
    ${JSON.stringify(obj, null, 4)}}
    ${obj.title}
  `);
};

./views/layouts/main.js

const mainTop = require('../partials/mainTop');
const mainBottom = require('../partials/mainBottom');

module.exports.render = (content) => {
  return `
    ${mainTop.render}

    ${content}

    ${mainBottom()}
  `;
}

./views/partials/mainTop.js

const render = `
  <!doctype html>
  <html class="no-js" lang="">
  <head>
  <title></title>
  ...
`;
module.exports.render = render;

./views/partials/mainBottom.js

module.exports = () => {
  return `
    ...
    </body>
    </html>
  `;
}
4

1 回答 1

1

console.log(state);// 返回一个{}空对象,预期 =>{ foo: "bar" }

当然,您会得到刚刚创建的空对象:

  • module.exports.state是 app.js 中分配给的属性。您的局部state变量不会被覆盖,它所引用的对象也不会发生变异。为此,您需要 index.state.foo = "bar";在 index.js 中进行。
  • 对象/变量在创建为空对象后立即记录。index.js 中的赋值是在app.use回调中异步发生的。如果您在分配console.log调用的渲染方法内部进行了操作,您将获得预期的值。但是,在这种情况下,您可能应该将其作为参数传递。
于 2017-02-01T23:36:30.723 回答