我正在构建一个CakePHP应用程序。代码的逻辑结构使每个控制器都被认为是它自己的迷你应用程序。
我正在使用jQuery来实现我的所有JavaScript功能。
我的问题是:构建JavaScript的正确方法是什么,只有需要它的页面才能拥有它?
我应该为每个应用分配单独的js文件。这样,App 1将app1.js包含在其所有视图中,App 2将只有app2.js等等。然后我可以拥有一个具有所有常规功能的main.js,并且它包含在所有页面中。
注意:我不想使用JsHelper而且我不想编写JS inline。
答案 0 :(得分:1)
我建议你看一下这个奇妙的家伙写的这个Autoload Plugin ......哎呀,由我:)。
因此,使用它可以轻松地将您的javascript甚至CSS拆分为单独的目录,并且每个控制器上都会包含单独的文件。
如果您想要关注趋势 - 请使用RequireJS,这样您就可以模块化您的代码并仅包含您需要的那些部分。
虽然Autoload是我的创作,但我转而使用RequireJS,我对结果非常满意。
我将用RequireJS解释我的方法。
您需要的是布局头部的以下代码:
<script>
<?php if(is_file(
__DIR__.'/../../webroot/js/action/'.
$this->request->params['controller'].'/'.
$this->request->params['action'].'.js'
)){ ?>
var rPath = root+'js/app/action/<?php echo
$this->request->params['controller'].'/'.
$this->request->params['action']; ?>';
<?php } ?>
</script>
在布局的底部,您需要包含requirejs文件:
<script
data-main="<?php echo $this->Html->url('/'); ?>js/app"
src="<?php echo $this->Html->url('/'); ?>js/libs/requirejs.js">
</script>
第一部分只是检查该文件夹中是否存在该特定控制器和操作的文件:
/wwwroot/js/actions/Posts/write.js
如果是这样,添加一个包含对该文件的引用的var rPath。
以下是我正在使用的RequireJS配置文件的示例:
require.config({
baseUrl: root+'js/',
paths: {
jquery : 'libs/jquery.min',
//...your convenient shortcuts
}
});
//That's where the magic happen
if(typeof(rPath) !== 'undefined'){
requirejs([rPath]);
}
最后,如果你需要在你的控制器帖子和你的动作写一些javascript,你需要创建一个文件: /wwwroot/js/app/Posts/write.js,内容如下:
define([
'jquery', //reference to jquery
'app/Posts/controller' //module which you wrote for controller specific functions.
//other libs or modules if needed.
], function($){
//your functions for wirite action
});
有关详细信息,请查看RequireJS文档。
希望有所帮助。