我遇到了一个问题,试图只加载我的应用程序需要的模块。该模块列表会有所不同,如下所示。
此代码内嵌在动态页面中:
<script data-main="js/main" src="js/require.js"></script>
<script>
//APPROACH #1
(function(){
<% foreach(DashBoardItem item in AvailableItems){ %>
require('js/dashboard/<%= item.Name.ToLower() %>').init(<%= CurrentUser.ID %>);
<% } %>
}());
</script>
我们的想法是产生类似这样的东西:
<script>
//APPROACH #1
(function(){
require('js/dashboard/sales').init(123);
require('js/dashboard/inventory').init(123);
require('js/dashboard/deadlines').init(123);
}());
</script>
我不确定这是否可行或是否应该这样做,因为上述方法会导致错误
Module name "js/dashboard/sales" has not been loaded yet for context: _. Use require([])
我试着生成这个:
<script>
//APPROACH #2
require(['js/dashboard/sales', 'js/dashboard/inventory', 'js/dashboard/deadlines' ],
function(sales, inventory, deadlines){
sales.init(123);
inventory.init(123);
deadlines.init(123);
});
</script>
但这失败了,因为显然 RequireJS 不会等待模块加载和那三个回调参数(sales
、inventory
、deadlines
) 在执行时将为 undefined
。
我是不是完全错了?如何将不同的所需模块列表从服务器端传递到客户端 JS?
更新 - 修复
我的问题是我的模块(销售、库存、截止日期)声明不正确。感谢 @anoopelias 下面的评论,我意识到我使用了 require(...)
而不是 define(...)
在他们中。所以他们就像:
//example of WRONG sales.js module
require(['jquery', 'other-module'], function($, otherModule){
//do stuff, return some object instance
});
一旦我像下面那样修复后,我就可以使用上面的方法 #2 并且它工作正常。
//example of correct sales.js module
define(['jquery', 'other-module'], function($, otherModule){
//do stuff, return some object instance
});
最佳答案
仅作记录,对于方法 #1,您只是忘记了模块周围的 []:
<% foreach(DashBoardItem item in AvailableItems){ %>
require(['js/dashboard/<%= item.Name.ToLower() %>']).init(<%= CurrentUser.ID %>);
<% } %>
除非你的 js/main 不需要这个模块,否则 requirejs 会报错。即使您将它们包含在您的 js/main 中,您也必须“等待”main 完成加载(因此将 foreach 嵌套在 js/main 的 require 调用中)
关于javascript - RequireJS 不等待模块加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205595/