Koa-handlebars:无法渲染视图:找不到部分

时间:2015-03-27 19:57:47

标签: javascript node.js handlebars.js template-engine

// project/layouts/main.hbs

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    {{{@body}}}
</body>
</html>


// project/views/home-public.hbs

{{> nav-public}}
<div class="container">
    <div class="starter-template">
        <h1>Home Public</h1>
        <p class="lead">This is my home.</p>
    </div>
</div>


// project/partials/nav-public.hbs

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Example</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
            <ul class="nav navbar-nav">
                <li class="active"><a href="/">Journey</a>
                </li>
                <li><a href="/">Departures</a>
                </li>
                <li><a href="about" style="margin-left:1em">About</a>
                </li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li><a href="/signout">Sign in</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

运行的节点代码:

app.use(handlebars({
    defaultLayout: 'main'
}));

app.use(function* () {
    yield this.render('home-public', {
        user: {
            email: "name@example.com"
        }
    });
});

我看不出有什么问题。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这个一开始也让我抓狂了。原因是你在{{> partial-name}}电话中使用了连字符和/或路径分隔符,这在你来自快递把手时似乎是合理的。答案在文档中:

  

partialId(文件)

     

与布局和视图相比,此函数稍微向后,但它需要一个部分模板文件的路径。 (相对于partialsDir)并将其转换为友好的车把标识符。

     

例如:“navigation.hbs”=&gt; “导航”

     

默认情况下,它会删除扩展名和驼峰大小写的剩余字符串。

     

例如:“nav / main.hbs”=&gt; “navMain”

基本上,默认情况下,它会将您的部分路径完全转换为camelCaseForHyphensAndDirectorySlashes,例如example/my-partial需要部分调用{{> exampleMyPartial }}

幸运的是,如果您更喜欢使用实际代表部分文件路径的部分名称,那么很容易定制。这是我使用的配置(我使用strip-extension模块来摆脱文件扩展名):

var stripExtension = require('strip-extension');
app.use(koaHandlebars({
  partialId: function(file) {
      // Note: the .replace below is just to normalise windows paths, you
      // may not need it.
      return stripExtension(file).replace('\\', '/');
  }
});