我在ASP.NET中使用RequireJS.有一个用户控件包含一个脚本文件,并注册一个启动脚本以初始化自己.这是生成的代码:
<script src="script/UserControls/myctrl.js" type="text/javascript"></script>
…
<script type="text/javascript">
function myCtrl1_init() {
// initialize control
// *JS ERROR* because myctrl.js hasn't run yet
Sys.Application.remove_load(myCtrl1_init);
}
Sys.Application.add_load(myCtrl1_init);
</script>
myctrl.js文件看起来像这样:
require(['script/dep1', 'script/dep2'], function(dep1, dep2) {
MyCtrl = function () {
};
MyCtrl.init = function(id) {
dep1.doSomething();
}
};
所以,问题是启动脚本在myctrl.js文件有机会运行之前运行.目前,require调用使用了一个回调函数,显然直到稍后才会运行,这就是问题…脚本返回并且浏览器在创建MyCtrl之前继续启动脚本.
我试过简单地调用require([‘script / dep1′,’script / dep2’]);在文件的顶部,但也不会阻止,并且脚本失败,因为尚未加载依赖项.顺便说一句,依赖关系是模块,例如他们使用define().
有没有办法与RequireJS同步加载脚本文件? API文档说“在具有同步加载的服务器端JavaScript环境中使用RequireJS应该像重新定义require.load()一样简单”,但我不知道这意味着什么.
有什么建议?
最佳答案 我假设require.js的脚本标记高于你提到的内容.如果是这样,那么我将myctrl.js转换为一个模块(使用“define(‘myctrl’,….)”而不是“require(..”在其中),然后在内联脚本标签内容中做一些事情喜欢:
<script type="text/javascript">
require(["myctrl"], function () {
function myCtrl1_init() {
// initialize control
// *JS ERROR* because myctrl.js hasn't run yet
Sys.Application.remove_load(myCtrl1_init);
}
Sys.Application.add_load(myCtrl1_init);
});
</script>
我不熟悉ASP.NET,因此我不确定在DOMContentLoaded之后可能触发的回调中执行那些Sys.Application调用是否可行,但以上是一般的想法.
无法在浏览器中使用RequireJS同步加载脚本,需要使用上面的回调方法. require.load()信息适用于希望生成在同步环境(基本上是非浏览器JS环境)中运行的RequireJS适配器的开发人员.