使用RequireJS自动加载依赖模块

时间:2014-04-04 12:25:40

标签: javascript knockout.js requirejs

我正在使用Knockout和Require。我在一个单独的模块中有一些Knockout处理程序,我想使用它。没有依赖于此模块的JavaScript代码,但它在HTML中的data-bind属性中使用。

我怎么知道要求每当添加淘汰的脚本时,它也应该添加这个模块并且它依赖于Knockout(它应该能够使用'ko')?

1 个答案:

答案 0 :(得分:1)

如果我说得对,这只是“定义一个带有依赖关系的模块”,这是一个非常基本的requirejs事情。请查看requirejs api文档的"Definition Function with Dependencies"部分。

以下是文档中的示例:

//my/shirt.js now has some dependencies, a cart and inventory
//module in the same directory as shirt.js
define(["./cart", "./inventory"], function(cart, inventory) {
        //return an object to define the "my/shirt" module.
        return {
            color: "blue",
            size: "large",
            addToCart: function() {
                inventory.decrement(this);
                cart.add(this);
            }
        }
    }
);

所以你可以在你的淘汰赛处理程序中执行此操作,在那里你可以将你的淘汰依赖项传递给函数。然后在每个模块中你需要挖空,你将你的淘汰处理程序添加到define语句中的依赖项。如果你在模块中不需要它们但只在DOM内部,那么你不必将它们传递给函数参数。您可以将敲除处理程序添加到define依赖关系列表的末尾,而不添加如下所示的其他参数:

define(["knockout", "knockout-handlers"], function(knockout) {
        //you're module using knockout, 
        //knockout-handlers will be available inside the dom
});

当我重新考虑我的答案时,我得出的结论是循环依赖不是问题。你可以使用shim配置来实现“自动依赖”:

//within your config
requirejs.config({
    shim: {
        'knockout': {
            deps: ['knockout-handlers']
        }
    }
});

//your knockout handlers module definition
define(["knockout"], function(knockout) {
        return {
          //Your knockout-handler module
        }
});

每次加载淘汰赛时都会加载你的淘汰赛。