在调用‘@content’之后,我在从布局文件中拉入页末脚本(或其他内容)时遇到了问题。我正在使用咖啡杯模板,并有以下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”没有插入内容。感谢您的帮助,谢谢。
发布于 2013-07-08 02:47:14
让我们来看看你的代码的编译后的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(function(){return "blah";}),它说传递div,一个函数,当被调用时将返回字符串blah。现在CoffeeKup知道返回给它的任何字符串都应该呈现给它以方便使用。但是由于我们不能返回多个东西(因为第一个返回存在于块中),我们该怎么办呢?
CoffeeKup提供了text函数,允许我们执行以下操作:
div ->
text "a"
text "b"编译后的代码如下所示:
div(function() {
text("a");
return text("b");
});这正是我们想要的,就像div和所有其他元素调用一样,text调用不返回字符串,而是直接输出内容。
因此,总而言之,解决方案是添加前缀:
@content
@getBlock('scripts').toHTML()使用text调用,因此它变成:
text @content
text @getBlock('scripts').toHTML()如果你想转义HTML实体(将<转换为<),那么你也需要添加h调用,这样h "content to be escaped"和text结合起来看起来就像text h "content to be escaped" -但是这只是一些需要注意的东西,不是你现在或这里需要的东西。
https://stackoverflow.com/questions/17513312
复制相似问题