简单谈谈为啥$this->registerJs没有注册js的问题 [ 技术分享 ]
作者:白狼 出处: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 条回复
白狼栈
最后登录:2023-03-08
在线时长:90小时7分
- 粉丝332
- 金钱1371
- 威望500
- 积分7271