我在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()一样简单”,但我不知道这意味着什么。
有什么建议吗?
答案 0 :(得分:2)
我认为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适配器的开发人员。