1

在调用“@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' 不插入内容。任何帮助表示赞赏,谢谢。

4

1 回答 1

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"- 但这只是需要注意的事情,而不是您现在或这里需要的东西.

于 2013-07-07T18:47:13.627 回答