2013-08-22 222 views
3

您好我正在使用requirejs将我的JavaScript代码组织到AMD模块中,我正在构建一个非单页网站,现在使用codeigniter,我做的是我有一个默认的布局HTML文件,我总是调用渲染身体的动态内容,所以我的脚本调用requirejs并具有data-main属性编码在我的布局HTML页面上。RequireJS根据ROOT URL + baseUrl +模块路径加载模块

<script data-main="<?=base_url('assets/js/main.js');?>" src="<?=base_url('assets/js/require.js');?>"></script> 

和我的main.js看起来像这样。

requirejs.config({ 
baseUrl: "assets/js", 
paths: { 
    jquery: 'vendor/jquery', 

    bootstrap: 'vendor/bootstrap', 

    datatables: 'vendor/jquery.dataTables' 

}, 

shim: { 
    jquery: { exports: '$' }, 
    datatables: { deps: ['jquery'] } 
} 
}); 

requirejs(['bootstrap','datatables'], function(){ 

}) 

所以当我在我的网址“localhost/ci-project /”上输入时,它会将布局页面与动态主体一起加载。在这种情况下,它工作正常。 sicne requirejs会正确渲染路径“localhost/ci-project/assets/js/vendor/[js file/module]”

但是当我更改URL时,'localhost/ci-project/welcome/admin ”。加载模块的要求是将baseUrl +模块路径连接到当前URL(在本例中为“localhost/ci-project/welcome/admin”),结果如下所示:

'localhost/ci -project/welcome/admin/assets/js/vendor/[module]'这是错误的。

那么我怎样才能配置requirejs总是加载从根url,然后连接baseUrl值与每个模块的路径一起?

回答

3

解决此问题的方法是从服务器端变量输出baseUrl

在你的PHP页面:

<script> 
var require = { 
    baseUrl: '<?= base_url(); ?>' // Or whatever outputs the full path to your site root 
}; 
</script> 
<script data-main="<?=base_url('assets/js/main.js');?>" src="<?=base_url('assets/js/require.js');?>"></script> 

创建require对象RequireJS加载之前允许您定义将被自动拾取的配置选项。

再次调用require.config()main.js里面可以了,它只会添加额外的配置选项,但一定要从那里删除baseUrl

1

西蒙的答案上面的帮助,当我有导航到具有参数的路线问题 - 相对路径到基地url出错。我正在使用asp .net mvc,但解决方案完全一样: (_Layout.cshtml)

<script> 
    var require = { 
     // by default, load any module IDs from 
     baseUrl: '@Url.Content("~/Scripts/lib")' 
} 
</script> 
<script data-main="@Url.Content("~/Scripts/application/app.js")" src="@Url.Content("~/Scripts/lib/require.js")"></script>