在引用“内容”模板数据变量后,在Docpad coffeekup布局文件中包含脚本/内容

时间:2013-07-07 15:07:00

标签: docpad coffeekup

在调用'@content'后,我无法从布局文件中提取页面末尾脚本(或其他内容)。我正在使用coffeekup模板并具有以下default.html.coffee布局文件。

doctype 5
html ->

  head ->

    meta(charset:"utf-8")
    title("Docpad")
    if @document.description?
      meta(name:"description", content:@document.description)

    stylesheets = ['/styles/app.css']
    @getBlock('styles').add(stylesheets).toHTML()

  body ->

    div class:"row", ->
      div class:"large-12 columns", ->
        h1(class:"docs header", "Header")
        hr()

    @content
    @getBlock('scripts').toHTML()

我遇到的问题是'@content'正确地生成并呈现特定于页面的内容,如果没有任何内容(例如,上面的@getBlock('scripts')行被删除或评论出)。但是,使用上面的代码,脚本的getBlock调用成功,但“@content”不插入内容。任何帮助表示感谢,谢谢。

1 个答案:

答案 0 :(得分:1)

让我们来看看你的代码的编译javascript。我们可以使用coffeescript.org上的编译器来执行此操作:

doctype(5);

html(function() {
  head(function() {
    var stylesheets;
    meta({
      charset: "utf-8"
    });
    title("Docpad");
    if (this.document.description != null) {
      meta({
        name: "description",
        content: this.document.description
      });
    }
    stylesheets = ['/styles/app.css'];
    return this.getBlock('styles').add(stylesheets).toHTML();
  });
  return body(function() {
    div({
      "class": "row"
    }, function() {
      return div({
        "class": "large-12 columns"
      }, function() {
        h1({
          "class": "docs header"
        }, "Header");
        return hr();
      });
    });
    this.content;
    return this.getBlock('scripts').toHTML();
  });
});

请注意this.content如何只是一个不可操作的声明。就像我这样做:"a"; "b"; "c"; "d"什么都不做。

您提供的代码的用法或意图似乎暗示了对CoffeeKup或CoffeeScript工作方式的误解,所以让我评估一下发生了什么,以及为什么有时它会起作用,有时它不会。

当我们执行div -> "blah"时,它会向div(function(){return "blah";})汇总,其中传递div一个函数,当被调用时将返回字符串blah。现在,CoffeeKup知道返回给它的任何字符串都应该为了方便而呈现。但是因为我们不能返回多个东西(因为第一个返回存在块),我们该怎么办?

CoffeeKup提供text功能,允许我们这样做:

div ->
    text "a"
    text "b"

编译时看起来像:

div(function() {
  text("a");
  return text("b");
});

这正是我们想要的,因为text调用,就像div和所有其他元素调用一样,不返回字符串并直接输出内容。

总而言之,解决方案是前缀:

@content
@getBlock('scripts').toHTML()

通过text调用,它变为:

text @content
text @getBlock('scripts').toHTML()

如果您想要转义HTML实体(将<转换为&lt;),那么您还需要添加h调用,因此h "content to be escaped"并且与text结合使用时会显得text h "content to be escaped" - 但这只是需要注意的事项,而不是您现在或此处需要的内容。