在视图中 使用 registerjs方法 无法加载js,如果使用render() 可以
yii2 js注册失败的问题
2
640
2016-05-14
抱歉 ,懂了,好像不可以删除
这个问题嘛,虽然你懂了,但是我还是要说说,毕竟前几天在群里看好多人都遇到过这个问题。
其实就是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一探究竟。
好像也没看出个什么嘛。别急,仔细看,我们会发现布局文件内的头尾分别是下面这样的。
那这到底是不是问题所在呢?很简单,我们在未使用布局文件的test.php内尝试测试一番,修改test.php文件如下
天呐,我们重新访问了下这个使用renderPartial渲染模版的action,控制台竟然神奇般的把111打印出来了!我眼神不好,到底发生了什么?ok,我们找到问题所在了,原来不是render renderpartial造成的,罪魁祸首居然是ta!我们接着分析为什么?不妨追追源码我们会发现
在yii2\BaseView.php文件中,beginPage方法开启了ob缓存
在yii2webView.php文件中,endPage方法输出了缓冲区内容,而输出的内容中,我们会发现包含yii2webView renderBodyEndHtml 方法的返回值,该方法则是实实在在的调用了Html::script 方法输出了我们注册的js文件或代码。
到此,我们终于领悟一番,大彻大悟的感觉,原来$this->registerJs没有把js代码注册到页面中是这个原因。