2

我在 AMD 环境中工作,并为此使用 Require.js。它还使用 KnockOut 作为框架。这里的问题是我刚刚下载了一个高度依赖knockOut的knockout插件。

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

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

4

2 回答 2

4

如果您引用的插件是 Mapping 插件,您将需要执行以下操作之一

  1. 将您的淘汰脚本文件命名为“knockout.js”

  2. 手动更改映射脚本中的定义方法,使其与您的名称匹配,即 define([" knockout-2.1.0 ", "exports"], factory); 这是调试映射脚本中的第 12 行。

如果是其他插件,请说明是哪个,以便我可以提供更多帮助。

于 2012-09-20T21:06:07.133 回答
2

真棒里德,我昨晚迷失了大约 3 个小时,所以这是交易:发生的事情是映射插件(例如)定义了一个硬编码的依赖项来淘汰,对于 node、commonjs 或 amd,对于你需要的 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 = {});
}

根据我的经验,我的 ko 文件位于 lib 下并重命名为 ko,因此如果您的文件位于“js/knockout/”文件夹下并重命名为 knockout-debbug-last-2.2.0.js,则需要更改同一行到

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

那条硬编码的行是插件加载失败的原因。

注意:我将其写为答案而不是评论,因为评论中的代码看起来非常糟糕。

于 2012-12-19T19:11:03.697 回答