我有一个页面使用了很多包含文件。它会动态选择要使用的正确包含文件。我希望(在包含文件中)能够向圣杯指定我希望它在头部包含一个特定的<link rel="stylesheet"/>
标签,
像这样输出的东西..
<html>
<head>
<title>My Life :: My Pets</title>
<link rel="stylesheet" href="style.css" type="text/css"> <!-- Normal Site Style -->
<link rel="stylesheet" href="include-my-pets" type="text/css"> <!-- Dynamic Style for Include -->
</head>
<body>
<h1>My Pets</h1>
<!-- This is the include file start -->
In the GSP here I said something like:
<r:require disposition="head">
<link rel="stylesheet" href="include-my-pets" type="text/css"> <!-- Dynamic Style -->
</r:require>
to get the CSS link tag pushed into the head.
<!-- This is the include file end -->
</body>
</html>
这对我来说使用 <r:script/>
标签效果很好。我可以在任何包含文件中的任何地方指定:
<r:script disposition="head">
alert ('hello')
</r:script>
我的布局会自动将警报问候卡在页面头部的<script/>
标签内。它也从体内取出。
资源插件不支持此功能。如果你看看 ResourcesPlugin 中的 r.script 实现:
def script = { attrs, body ->
def dispos = attrs.remove('disposition') ?: 'defer'
storePageFragment('script', dispos, body())
}
对于"r.stylesheet"标签做类似的事情似乎很容易,但是storePageFragment和其他帮助程序方法是私有的,因此如果不复制大量内容,就无法从外部执行此操作。
我建议你分叉资源插件,沿着脚本标签的行实现一个样式表标签并发送拉取请求。
资源插件的优点是,您可以创建资源的逻辑组(css 和 js)并在需要时使用它们。阿洛不要忘记在head
教派的末尾和body
部分的末尾打电话给<r:layoutResources />
。否则,资源将无法正确生成。
这不是"圣杯"的做事方式,但这就是我实现它的方式。我这样做的部分原因是因为我觉得在ApplicationResources.groovy中定义资源对于不熟悉资源插件的非grails开发人员来说可能并不明显。我更喜欢在包含文件中具有明确的资源链接的想法,这是显而易见的。
我现在的做法是这样的。
Kitty和Doggy需要自定义CSS和JavaScript(它们都是宠物的一部分),但其他链接,如MyLife不需要它们。
In URLMappings.groovy
"/mypets/kitty" {
controller="pets",
subpage="kitty.gsp"
action="index"
css="kitty.css",
js="kitty.js",
}
"/mypets/doggy" {
controller="pets",
subpage="doggy.gsp"
action="index"
css="doggy.css",
js="doggy.js",
}
"/mylife" {
controller="life",
action="index"
}
布局.gsp
...contains all the usual site-wide resources...
在宠物.gsp
<html>
<head>
<title>${title}</title>
<link rel="stylesheet" type="text/css" href="${resource(dir: 'resources/modules/css', file: css)}"/>
<script src="${resource(dir: 'resources/modules/js', file: js)}"></script>
</head>
<body>
Select your pet: <select.../>
<!-- It's kitty.gsp and doggy.gsp (below) that need access to their own kitty and doggy js and css files -->
<g:include view="$page"/>
</body>
</html>