maclechan 2015-05-21 16:26:39 48803次浏览 15条评论 55 13 0

(注:以下为Yii2.0高级应用测试)

Yii2.0对于CSS/JS 管理,使用AssetBundle资源包类。

视图如何按需加载CSS/JS ?

资源包定义:

backend/assets/AppAsset.php

namespace backend\assets;  
  
use yii\web\AssetBundle;  
  
/** 
 * @author chan <maclechan@qq.com> 
 * @since 2.0 
 */  
class AppAsset extends AssetBundle  
{  
    public $basePath = '@webroot';  
    public $baseUrl = '@web';  
    //全局CSS  
    public $css = [  
        'css/animate.css',  
        'css/style.min.css',  
    ];  
//全局JS  
public $js = [  
    'js/jquery-2.1.1.js'  
]; 
    //依赖关系  
    public $depends = [  
        'yii\web\YiiAsset',  
        'yii\bootstrap\BootstrapAsset',  
    ];  
  
     //定义按需加载JS方法,注意加载顺序在最后  
    public static function addScript($view, $jsfile) {  
        $view->registerJsFile($jsfile, [AppAsset::className(), 'depends' => 'api\assets\AppAsset']);  
    }  
      
   //定义按需加载css方法,注意加载顺序在最后  
    public static function addCss($view, $cssfile) {  
        $view->registerCssFile($cssfile, [AppAsset::className(), 'depends' => 'api\assets\AppAsset']);  
    }  
 }

视图中如何使用:

use yii\helpers\Html;  
use backend\assets\AppAsset;  
use backend\widgets\Alert;  
  
/* @var $this \yii\web\View */  
/* @var $content string */  
  
AppAsset::register($this); 

查看源文件,看清CSS和JS的加载顺序
输入图片说明
输入图片说明
可以看出以此顺序为:依赖关系 -> 自定义全局CSS/JS
如果,某个视图需要单独引入一个CSS/JS,并且,在页面中还要写些CSS/JS,该如何做?

1,在页面中单独写样式:

$cssString = ".gray-bg{color:red;}";  
$this->registerCss($cssString); 

2,在页面中单独写JS(使用数据块)

<div id="mybutton">点我弹出OK</div>  
  
<?php $this->beginBlock('test') ?>  
    $(function($) {  
      $('#mybutton').click(function() {  
        alert('OK');  
      });  
    });  
<?php $this->endBlock() ?>  
<?php $this->registerJs($this->blocks['test'], \yii\web\View::POS_END); ?>  

在视图中引入不是定义在全局里的CSS或JS。

分别有两种方法:

方法1,在资源包管理器里面定义一个方法,然后在视图中注册即可(推荐使用这种)

如上面代码己定义:

//定义按需加载JS方法,注意加载顺序在最后  
public static function addScript($view, $jsfile) {  
    $view->registerJsFile($jsfile, [AppAsset::className(), 'depends' => 'api\assets\AppAsset']);  
}  

视图中使用如下:

AppAsset::register($this);  
//只在该视图中使用非全局的jui   
AppAsset::addScript($this,'@web/js/jquery-ui.custom.min.js');  
//AppAsset::addCss($this,'@web/css/font-awesome/css/font-awesome.min.css');  

查看下源码,特别的注意下,加载的顺序,是我们想要的结果
输入图片说明
此外注意:在上面的addScript方法中,如果没有 ’depends‘=>’xxx‘ ,此处加载的顺序将会颠倒。

方法2,不需要在资源包管理器中定义方法,只要在视图页面直接引入即可

AppAsset::register($this);  
//css定义一样  
$this->registerCssFile('@web/css/font-awesome.min.css',['depends'=>['api\assets\AppAsset']]);  
  
 $this->registerJsFile('@web/js/jquery-ui.custom.min.js',['depends'=>['api\assets\AppAsset']]);  
//$this->registerJsFile('@web/js/jquery-ui.custom.min.js',['depends'=>['api\assets\AppAsset'],'position'=>$this::POS_HEAD]);  

//以上定义两种有点区别,见下图
加载在body区
输入图片说明

加载在head中
输入图片说明

博客源文地址:
http://blog.csdn.net/maclechan/article/details/45803821
(源创)

觉得很赞
  • 评论于 2015-05-21 16:58 举报

    楼主辛苦了,咱们网站也有上传图片的功能,以后再发帖请上传到咱们服务器上,不要再外部引用了。

    2 条回复
    评论于 2015-05-21 17:16 回复

    我是找了半天没找到,图片就只有一个链接。最后没办法。

    评论于 2017-07-23 09:16 回复

    站长,评论时的markdown解析器是不是有问题,点击修改保存后有时`会失效,有时会多一个`在页面上。和预览时不一致。

  • 评论于 2015-05-22 12:53 举报

    自定义加载Assets不就得了,然后说明是否依赖jquery,bootstrap等库

  • 评论于 2015-05-26 16:59 举报

    和我写的差不多,相互补充吧。http://www.yiichina.com/tutorial/387

  • 评论于 2015-06-01 14:57 举报
    
    $this->registerJs(
       '$("document").ready(function(){ 
            $("#login-form").validate({
                errorElement : "small", 
                errorClass : "error",
                rules: {
                         "AgNav[nav_cn]": {
                             required: true,
                         },
                },
                messages:{
                       "AgNav[nav_cn]" : {  
                            required : "此字段不能为空.",
                        },
                }
            });
        });'
    );
    
    

    再补个写法

    1 条回复
    评论于 2017-08-12 18:42 回复

    这种写法太恶心了,建议使用代码块写法 $this->beginBlock('test')

    觉得很赞
  • 评论于 2015-07-16 11:47 举报

    要是我定义了两个布局 一个只加载css/animate.css 另一个只加载'css/style.min.css'呢

    1 条回复
    评论于 2015-07-27 19:15 回复

    那把另一个写到布局里面去

  • 评论于 2015-11-20 15:08 举报

    超赞,没这文章我还真连css,js 都引不进去。

    , 觉得很赞
  • 评论于 2015-12-28 14:10 举报

    这个全局的引用方式!如果是模块内呢?样式是模块里面的只是针对模块!..

    1 条回复
    评论于 2016-01-07 14:05 回复

    是的。....

  • 评论于 2015-12-29 11:23 举报

    点赞赞赞赞赞

  • 评论于 2016-01-29 16:31 举报

    补个直接写最上面
    $this->registerCssFile('@web/css/index-css.css');

  • 评论于 2016-08-06 16:56 举报

    赞,zan

  • 评论于 2016-11-10 11:26 举报

    0=api\assets\AppAsset 这个属性是怎么回事,可不可以去掉

    1 条回复
    评论于 2018-04-03 09:27 回复

    同问 一样的问题

  • 评论于 2017-05-23 13:51 举报

    非常不错的文章,谢谢,学习了

  • 评论于 2017-07-23 09:07 举报

    开头就说“全局css”,"全局js",这个说法不妥。何为全局?你所谓的全局就是如下吗?

    AppAsset::register($this);
    

    所谓的按需加载,单独引入JS/CSS就是如下吗?

    $this->registerCssFile('@web/css/font-awesome.min.css',['depends'=>['api\assets\AppAsset']]);
    AppAsset::addScript($this,'@web/js/jquery-ui.custom.min.js'); 
    

    如何全局了,怎么体现全局?如何按需加载了,两者的区别在哪里?没有说明白吧,这样的字眼容器误导人。
    只能说文中所谓的全局和单独引入都是引入某些JS/CSS到当前视图的方式而已。

    我可以写个AssetBundle,那么在视图中就应该

    XXX::register($this);
    

    如果没有写AssetBundle,而要临时紧急需要加载一个js,那么就要

    $this->registerJsFile('xxxx.js');
    

    还有,那个

    api\assets\AppAsset
    

    是个什么东西,你没有介绍吧?在你的html截图里体现的有点模糊,说明不了单独加载时depends的作用,估计api\assets\AppAsset就是那个yii.js吧。

    个人理解,欢迎拍砖

  • 评论于 2017-08-11 17:48 举报

    我是用的基础 版的用了这种方法还是不行,而且 也不报错,心塞,用这种可以<?=Html::jsFile('@web/js/t.js')?>,这是什么情况 ,

  • 评论于 2018-04-03 08:58 举报

    12333.png
    为什么后面有尾巴

您需要登录后才可以评论。登录 | 立即注册