2013-03-18 75 views
0

我知道这个问题已被问了好几次,但我似乎无法找到一个适当的解决方案,我的问题。如何处理在MVC网站查看特定的Javascript

我使用CodeIgniter,一个遵循MVC(模型 - 视图 - 控制器)原理的PHP框架。

我有很多javascript文件,如jQuery和其他通用库,我需要为每个页面包含在标记中。我也有查看特定的JavaScript,直接嵌入在脚本块的视图。

视图的例子customerInfo.php

<script type="text/javascript"> 
    // some javascript here for customerInfo view 
    // I MUST be able to use PHP variables in this script block ex: 
    var customerName = "<?php echo $customerName; ?>"; 
</script> 

<p class="someClass">Hello <?=$customerName?>, may the lord provide you with bananas</p> 

我的网站布局如下:

<html> 
<head> 
    <script src="http://coolStorybro.com/jquery.js" type="text/javascript"></script> 
    <script src="http://coolStorybro.com/commonStuff.js" type="text/javascript"></script> 
</head> 

<body> 

<div class="header">some header stuff</div> 

<div class="pageContent"> 
    <?php echo $view; ?> // In this case, $view will hold the view customerInfo 
</div> 


</body> 
</html> 

我的目标是有我在同一个地方所有的JavaScript,所以我可以缩小它,并最终将其放在我的页面底部进行加载优化。

我知道我可以存储该视图特定的JavaScript在被称为customerInfo.js一个单独的文件,并在标签加载它,但我觉得这太过分了创建一个单独的JavaScript文件为每个查看和我将无法使用PHP在他们,我必须。

所以我问你们,有没有解决我的问题,或者我注定我的网页与脚本块聚集在一起?

谢谢你的时间。

编辑:

莫不是把视图特定的JavaScript(所有视图)在一个文件中并以某种方式在模块单独它,只有加载特定的模块,用于所需的视图的方法吗?

比方说viewsJS.js拥有所有该视图特定的javascript:

module ("customerInfo", 
    $(".someClass").html("Bla bla bla"); 
); 

module ("invoiceInfo", 
    // Some code to be executed when the invoiceInfo module is loaded 
); 

一旦确定了每个模块(意见)的JavaScript的定义,有将其加载到其相应的视图的方式。事情是,我不能在我的视图中有一个脚本块来“加载”模块,所以......我无能为力。

+0

你有没有试过像commonjs/amd模块系统? – Ven 2013-03-18 14:46:38

+0

您不必在脚本中嵌入PHP。您可以将这些信息放入HTML元素的“数据”属性中,或者类似的东西。 – Pointy 2013-03-18 14:47:36

+0

将javascript添加到页面底部而不是页眉是不好的做法。 – Derfder 2013-03-18 14:53:42

回答

1

application/views

/includes/javascript.php 
/template.php 

然后把你的主代码的template.php创建该文件夹结构:

<html> 
<head> 
    <?php echo $this->load->view('includes/javascript'); ?> 
</head> 

<body> 

<div class="header">some header stuff</div> 
... 

,并把所有你的JavaScript在的JavaScript。PHP

application/views/includes 

例如像:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script> 

压轴输出看起来像在你的浏览器,如:

<html> 
<head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
     <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script> 
</head> 

<body> 

<div class="header">some header stuff</div> 
... 

支持加载特定的JavaScript文件,你可以做这样的事情在您的javascript视图中:

<?php if (is_frontpage()) : ?> 
    <script src="http://localhost/javascriptforfrontpage.js"></script> 
<?php endif; ?> 

<?php if (is_contact()) : ?> 
    <script src="http://localhost/javscriptforcontactpage.js"></script> 
<?php endif; ?> 

<?php // this would be loaded everywhere ?> 
<script src="http://localhost/javascripteverypage.js"></script> 

仅加载客户信息javascript:

第一次从控制器发送到您的视图$data['load_js_customer_info']像:

public function customerInfo() 
    { 

     $data['load_js_customer_info'] = "Customer Info"; 
     $data['customer'] = $this->mdl_admin->get_customer(); 
     $this->load->view('template', $data); 
    } 

,并在视图(包含所有的JavaScript),你犯了一个条件:所以,如果从客户信息控制不是,没有加载

<?php if ($load_js_customer_info) : ?> 
    <script src="http://localhost/javscriptforcustomerinfo.js"></script> 
<?php endif; ?> 

的javscript。

+0

你的回答可以使用一些说明。我真的不明白你真正的意思是“元”。我想你的第二个“meta”实际上是“javascript”。 – user2012040 2013-03-18 17:36:08

+0

忘掉元。无论如何,它是否适用于这种方式加载JavaScript? – Derfder 2013-03-18 17:39:06

+0

我不知道它将如何解决我的问题。我解释你的答案的方式是,你的includes/javascript视图将是一个持有javascript视图的PHP文件。在那种情况下,我只会包含一个包含所有视图代码的JavaScript文件,但这不是我所需要的。在这种情况下,我需要以某种方式只加载该特定视图的javascript(customerInfo)。 – user2012040 2013-03-18 17:48:32