2011-03-07 66 views
4

我使用RequireJS在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()一样简单,但我不知道这意味着什么。

有什么建议吗?

回答

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,所以我不知道,如果它是确定做回调那些Sys.Application电话DOMContentLoaded之后可能会触发,但上面的总体思路。

无法在浏览器中使用RequireJS同步加载脚本,需要使用类似上述的回调方法。require.load()信息适用于想要使RequireJS适配器同步运行的开发人员环境(基本上是非浏览器的JS环境)

+0

那么,异步完成整个初始化,呃?似乎是合理的,但我可以指望在myCtrl1_init触发时完成加载的DOM吗? – alekop 2011-03-09 07:44:58

+0

@jburke,这个作品,谢谢。 – alekop 2011-03-10 08:24:02

+0

如果您想确保在DOM准备好后myCtrl1_init被触发,请使用require.ready()包装代码。需要([“myctrl”],函数(){require.ready(函数(){函数myCtrl1_init ..... – jrburke 2011-03-12 06:39:27