我在Yii2框架上做一个网络应用程序。定义(扩展)新的AssetBundle
class NeonAsset extends AssetBundle {
public $sourcePath = '@app/themes/neon/';
public $css = [
'css/font-icons/entypo/css/entypo.css',
'...',
'...'
];
public $js = [
'js/be_in_head_tag.js',
'...',
'...',
];
}
渲染时,CSS文件发布在<head>
标记中,JS文件发布在<body>
标记的底部。没关系。
但我希望在be_in_head_tag.js
标记中发布一个<head>
文件。当我使用$jsOptions
时,它会将所有JS文件移动到<head>
标记中
是否可以只为一个文件制作选项?
答案 0 :(得分:7)
其中一个变体将该文件转换为单独的资产类:
class HeadPublishAsset extends AssetBundle {
public $sourcePath = '@app/themes/neon/';
public $js = ['js/be_in_head_tag.js'];
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
}
并为您的基类添加依赖项,如:
class NeonAsset extends AssetBundle {
...
public $depends = ['app\assets\HeadPublishAsset'];
...
}
答案 1 :(得分:0)
我不知道是否有正式的方式(可能不会使options
对象的规范过于复杂),但是与接受的答案相比,还有另一种更简单的方法。 t要求您创建另一个AssetBundle
。
您需要做的就是创建另一个数组,例如:
public $head_js =
[
"path/to/src.js"
];
然后覆盖registerAssetFiles
函数,如下所示:
public function registerAssetFiles($view)
{
foreach($this->head_js as $js)
{
$options = [];
$options["position"] = \yii\web\View::POS_HEAD;
$url = Url::to($this->baseUrl . "/" . $js);
$view->registerJsFile($url, $options);
}
parent::registerAssetFiles($view);
}
答案 2 :(得分:0)
我很高兴地说,在某些时候,已经在Yii2中添加了在文件级别执行此操作的功能。但是,它没有出现在任何文档示例中。我已经测试并确认...
class NeonAsset extends AssetBundle {
public $sourcePath = '@app/themes/neon/';
public $css = [
'css/font-icons/entypo/css/entypo.css',
'...',
'...'
];
public $js = [
['js/be_in_head_tag.js', 'position' => \yii\web\View::POS_HEAD],
'...',
'...',
];
}
$js
数组中包含的选项现在传递到相关方法,并导致文件包含在html文件的选定部分中。