使用反射,动态加载需要模块

时间:2014-06-12 13:06:46

标签: javascript requirejs

所以我有一个小的requirejs应用程序需要在运行时创建动态类列表的实例。基本上,反思。我已经做了很多阅读,但我一直在寻找很多关于Typescript的引用,我没有使用它。

主要思想是在requirejs准备好之前,一个数组加载了一个需要的类列表。这个数组在其主入口点之后被赋予requirejs,我希望为每个条目创建一个实例。

我在这里阅读了Ben Nadal的博客http://www.bennadel.com/blog/2320-extending-classes-in-a-modular-javascript-application-architecture-using-requirejs.htm,我喜欢他的模式,并认为这对于我计划动态创建的一些模块非常有效。

我想到我可以这样做: -

_.each(loader, function(dep) {
            require([dep.name]);
        });

loader是全局加载数组列表。这不会创建依赖关系的实例,这就是我想要的情况,如下所示: -

new Carousel('Delboy');
new Carousel('Rodney');
new Carousel('Grandad');

在这个例子中,这将创建一个3个新轮播的实例,每个轮播都有一个通过构造函数传入的名称。我想我的理解中遗漏了一些东西,感谢帮助。

1 个答案:

答案 0 :(得分:1)

每个已解析的AMD依赖项都是AMD模块,这意味着它是单例对象或函数。在你提到的Ben Nadel的帖子中,“定义”和“实例”之间存在区别。定义是单例,从定义(函数)可以创建多个实例。在Ben的术语中,RequireJS只会为您提供定义,由您来创建实例。

因此,以下内容适用于您尝试执行的操作:

define('Carousel', [], function (name) {
    this.name = name;
});
var loader = {};
var carousels = ['Delboy','Rodney','Grandad'];

carousels.forEach(function (carouselName) {
    require(['Carousel'], function (Carousel) {
        loader[carouselName] = new Carousel(carouselName);
    });
});