简单谈谈为啥$this->registerJs没有注册js的问题

40 篇文章 0 订阅

作者:白狼 出处:http://www.manks.top/question/20160514000004.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
这个问题嘛,虽然你懂了,但是我还是要说说,毕竟前几天在群里看好多人都遇到过这个问题。
其实就是registerJs为啥没有注册js的问题。
为啥render可以但是renderPartial不行,为什么呢为什么呢?
其实问题的核心不在render和renderPartial,究其原因,我们来细细的分析一下。
为了更好的说明白问题所在,我们写了两个action,一个是使用renderPartial渲染test.php模版的test action,另一个是使用render方式渲染test2.php模版的test2 action.
而两个模版文件的内容一致,如下,仅仅是注册一段js代码到console并记录下来

<?php $this->registerJs(' console.log(111); '); ?>

想必不用我说你也明白,使用renderPartial的action中,控制台没记录任何值,但是使用了布局方式渲染的action却在控制台打印出了111。难道真的就是render和renderPartial的区别造成的,至少目前是的,我们接着往下看。
众所周知,render方法是使用了布局的方式对test2.php渲染,那问题会不会出在布局文件上呢?我们打开其所使用的布局文件main.php一探究竟。
好像也没看出个什么嘛。别急,仔细看,我们会发现布局文件内的头尾分别是下面这样的。

<?php $this->beginPage() ?> 
<?php $this->beginBody() ?> 
这里是你的内容 
<?php $this->endBody() ?> 
<?php $this->endPage() ?>

那这到底是不是问题所在呢?很简单,我们在未使用布局文件的test.php内尝试测试一番,修改test.php文件如下

<?php $this->beginPage() ?> 
<?php $this->beginBody() ?> 
<?php $this->registerJs(' 
console.log(111); 
'); ?>
<?php $this->endBody() ?> 
<?php $this->endPage() ?>

天呐,我们重新访问了下这个使用renderPartial渲染模版的action,控制台竟然神奇般的把111打印出来了!我眼神不好,到底发生了什么?ok,我们找到问题所在了,原来不是render renderpartial造成的,罪魁祸首居然是ta!我们接着分析为什么?不妨追追源码我们会发现
在yii2\base\View.php文件中,beginPage方法开启了ob缓存
在yii2\web\View.php文件中,endPage方法输出了缓冲区内容,而输出的内容中,我们会发现包含yii2\web\View renderBodyEndHtml 方法的返回值,该方法则是实实在在的调用了Html::script 方法输出了我们注册的js文件或代码。
到此,我们终于领悟一番,大彻大悟的感觉,原来$this->registerJs没有把js代码注册到页面中是这个原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值