PHP MVC:将动态生成的Javascript放在何处
大多数PHPVC系统遵循一种模式,其中请求被路由到特定的控制器操作,然后控制器设置一组变量以在视图中使用 当您处于一个机构/服务工作环境中,该环境对UI元素使用大量动态HTML时,这种模式会导致使用视图变量生成大量javascriptPHP MVC:将动态生成的Javascript放在何处,php,javascript,model-view-controller,views,Php,Javascript,Model View Controller,Views,大多数PHPVC系统遵循一种模式,其中请求被路由到特定的控制器操作,然后控制器设置一组变量以在视图中使用 当您处于一个机构/服务工作环境中,该环境对UI元素使用大量动态HTML时,这种模式会导致使用视图变量生成大量javascript <script type="text/javascript"> jQuery(document).ready(function(){ $('#ui-element).init( {
<script type="text/javascript">
jQuery(document).ready(function(){
$('#ui-element).init(
{
'param1':<?=$this->param1;?>,
'param2':<?=$this->param2;?>,
}
);
});
</script>
jQuery(文档).ready(函数(){
$('#ui元素).init(
{
“参数1”:,
“参数2”:,
}
);
});
虽然这是可行的,但我发现它会导致使用HTML、PHP和Javascript的可怕的意大利面条混合视图。它还冒犯了某类前端开发人员,他们认为所有javascript都应该包含在外部文件中
那么,您处理这个问题的模式/实践是什么?具体地说,当您想要为PHPMVC框架中的Javascript小部件提供一组默认数据时,如何在保持干净和模块化的同时做到这一点?这仅仅是一个纪律问题,还是有特定的设计模式可以在这里强制模块化**,同时仍然为有才华的客户端开发人员提供一个以标记为中心的环境。编辑:
你也不必那么复杂,你可以简单地拥有一个php类/函数,它只代理ob_start/ob_get_clean,然后将js存储在某个地方,然后将js输出到其他地方。您不必通过php支持或集成库的功能
if可以像下面这样简单:
class UnobtrusiveJsHelper {
protected static $_instance;
protected $_js = array();
protected $_ready = array();
public static function getInstance()
{
}
public static function setInstance(UnobtrusiveJsHelper $instance)
{
}
public function captureStart($key = null)
{
if(null !== $key)
{
$this->_js[$key] = null;
}
ob_start();
}
public function captureEnd($key = null)
{
if(null !== $key)
{
$this->_js[$key] = ob_get_clean();
return;
}
$this->_js[] = ob_get_clean();
public function __toString()
{
return $this->dumpJs() . $this->_dumpReady();
}
public function dumpJs(array $attributes = null)
{
if(!empty($this->_js))
{
return "<script type=\"text/javascript\">". implode("\n", $this->_js) . "</script>";
}
return null;
}
public function dumpReady(array $attributes = null)
{
if(!empty($this->_js))
{
return '<script type="text/javascript">$(document).ready(function(){'. implode("\n", $this->_js) . '});</script>';
}
return null;
}
}
在您的布局中(此处为assumign两步视图):
这就是您使用助手的目的。例如,在Zend_框架中,所有这些小的
onLoad/Ready
片段都被添加到堆栈中。然后,它们在头部的一个地方同时输出
我有一个我为jQ使用的特殊助手,它在Symfony下也做类似的事情
它们允许像$jq->setVar('myjsvar',1)这样的操作代码>然后,当我转储此文件时,会得到如下结果:
var myjsvar=1代码>在头部的脚本标记中
查看ZendX_Jquery和Zend_Dojo以及它们各自的视图帮助器类,以了解该功能的一个很好的示例。本次讨论的很多内容都是关于最佳实践的。老实说,如果<100行,IMHO,你所做的很好。另一种方法是从视图中调用函数,并将js作为单独的文件,如下所示(使用适当的默认值):
jQuery(文档).ready(函数(){
showSomeWidget(,);
}
您也可以使用一些jQuery模板插件,如Dojo,但我经常会发现问题多于它的价值。我个人喜欢这种方法,如果每个人都参与进来,这是很好的,但我发现它最终会阻碍优秀的客户端开发人员,因为1.他们的视图中有这些非本地blob 2.有一个前期的编写成本当您想要合并一些新的jQuery/Dojo/Third party元素时,请使用帮助器。使用PHP生成HTML/Javascript(帮助器就是这样做的)似乎比纯基于视图的方法需要更多的开发时间。不过,还是有用的信息,谢谢!
<?php $js->captureStart(); ?>
var myjsvariable = 0;
<?php $js->captureEnd();
<script src='/js/widgets.js'></script>
<script type="text/javascript">
jQuery(document).ready(function(){
showSomeWidget(<?=$this->name ?> , <?=$this->place ?> );
}
</script>