使Require.JS与Knockout配合良好

时间:2012-09-20 20:06:50

标签: javascript knockout.js requirejs amd

我在AMD的环境中工作并使用Require.js。它还使用KnockOut作为框架。这里的问题是我刚下载了一个针对淘汰赛的插件,这个插件在很大程度上取决于knockOut。

现在由于我的应用程序的AMD性质的一些问题,我并不完全知道,我的插件无法正常工作,并且在加载插件时抛出Ko未定义的错误。

那些曾经遇到过类似问题的人的建议是什么?

1 个答案:

答案 0 :(得分:2)

很棒的里德,我昨晚迷失了3个小时,所以这就是交易: 发生的事情是映射插件(例如)定义了一个硬编码的依赖关系,对于node,commonjs或amd,对于你需要指定你的淘汰插件“route”或“path”的requirejs,例如:我的淘汰文件被重命名为ko.js并映射到ko.mapping.js,它们位于我在路径配置中重命名为“lib”的文件夹插件中

require.config({
    baseUrl: "js/",
    paths: {
        "lib" : "plugins"
    }
});

在这种情况下,必须在映射插件中重命名的行是相同的但不是版本号,你只需要放置你的ko文件的位置。

if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
    // CommonJS or Node: hard-coded dependency on "knockout"
    factory(require("knockout"), exports);
} else if (typeof define === "function" && define["amd"]) {
    // AMD anonymous module with hard-coded dependency on "knockout"
    define(["lib/ko", "exports"], factory);
} else {
    // <script> tag: use the global `ko` object, attaching a `mapping` property
    factory(ko, ko.mapping = {});
}

根据我的经验,我在lib下有我的ko文件并重命名为ko,所以如果你的文件在“js / knockout /”文件夹下并且被重命名为knockout-debbug-last-2.2.0.js你需要改变

的同一行
define( [ 'js/knockout/knockout-debbug-last-2.2.0' ] , factory );

该硬编码行是导致插件加载失败的原因。

注意:我把它写成答案而不是评论,因为评论中的代码看起来很糟糕。