在调用'@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”不插入内容。任何帮助表示感谢,谢谢。
答案 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实体(将<
转换为<
),那么您还需要添加h
调用,因此h "content to be escaped"
并且与text
结合使用时会显得text h "content to be escaped"
- 但这只是需要注意的事项,而不是您现在或此处需要的内容。