当我使用普通return this->render('create', ['model' => $model])
时,我的弹出窗口全部变得混乱。当我改为return $this->renderAjax('create', ['model' => $model]);
时,一切都在神奇的地方。我已经看了很多关于renderAjax()的内容,但似乎绝对没有任何内容。有人能告诉我它的作用吗?我知道ajax,但据我所知,它通常与css或bootstrap无关。
答案 0 :(得分:15)
要首先了解render()
和renderAjax()
之间的区别,您需要了解render()
的工作原理。
基本上,当调用render()
时,每个JS和CSS代码以及在视图中注册的文件引用都被收集在几个数组中,以便稍后在适当的位置呈现 - 这些地方存储在布局及其代码中通过调用beginPage()
,head()
,beginBody()
,endBody()
和endPage()
来呈现。
您可以通过在相关方法中设置第二个参数来指出应该呈现JS代码的位置 - 例如:
$this->registerJs("alert()", \yii\web\View::POS_HEAD);
呈现
<script type="text/javascript">alert()</script>
在方法$this->head()
所在的布局中。
一切正常,直到您只想渲染没有布局的视图的主要部分。没有它(和它的方法,如beginPage()
)JS和CSS引用不能以前面的方式呈现,这就是为什么这个花哨的jQuery代码旋转方块不起作用 - JS库尚未包含在那里。
当您从视图中调用$this->render()
或仅从控制器调用$this->renderPartial()
时,确实发生了这种情况 - 不应用布局。
renderAjax()
现在正在救援。
此方法并不关心布局,因为它本身会调用beginPage()
,head()
,beginBody()
,endBody()
和endPage()
方法。多亏了这一点,每一段JS代码都可以附加到渲染视图中,即使需要在AJAX弹出窗口内完成,jQuery库也可以再次旋转这个方块。
答案 1 :(得分:1)
render()公共方法
呈现视图。
可以使用以下格式之一指定要渲染的视图:
路径别名(例如&#34; @app/views/site/index
&#34;);
应用程序中的绝对路径(例如&#34; //site/index
&#34;):视图名称以双斜线开头。将在应用程序的视图路径下查找实际视图文件。
当前模块中的绝对路径(例如&#34; / site / index&#34;):视图名称以单斜杠开头。将在当前模块的视图路径下查找实际视图文件。
相对视图(例如&#34;索引&#34;):视图名称不以@或/开头。将在视图$ context的视图路径下查找相应的视图文件。如果没有给出$ context,它将在包含当前正在呈现的视图的目录下查找(即,在另一个视图中呈现视图时会发生这种情况)。
renderAjax()公共方法
呈现视图以响应AJAX请求。
此方法与render()类似,不同之处在于它将围绕使用beginPage(),head(),beginBody(),endBody()和endPage()调用呈现的视图。通过这样做,该方法能够使用JS / CSS脚本和在视图中注册的文件注入渲染结果。