【问题标题】:AMD modules not loading, undefinedAMD 模块未加载,未定义
【发布时间】:2013-12-20 21:23:29
【问题描述】:

我的文件的第一行如下所示:

define(['plugins/http', 'durandal/app', 'knockout', 'plugins/ajax', 'plugins/formatters'], function (http, app, ko, ajax,formatters) {

我的一些 AMD 模块加载得很好,但有些却没有,在这个例子中,formatters 参数是未定义的。

控制台中没有显示错误,并且在与其他插件正常工作的插件文件夹中存在一个 formatters.js 文件。

我该如何调试呢?当我在 formatters.js 中放置断点时,它正在运行,那么为什么参数未定义?

我剥离了我的格式化程序 js,所以它几乎什么都没有,只有一个功能,但它仍然不起作用:

define(['knockout'], function (ko) {
    'use strict';

    return {
        //convert to number
        rawNumber: function (val) {
            if (val == null)
                return 0;
            else
                return Number(ko.utils.unwrapObservable(val).toString().replace(/[^\d\.\-]/g, ''));
        }
    };
});

我的模块有问题,或者我的 durandal 配置有问题,或者其他人是否发生过模块未定义的情况?这意味着什么?

请帮忙。谢谢!

【问题讨论】:

    标签: durandal


    【解决方案1】:

    通常当我遇到 AMD 模块的这个问题时,是因为我有两个相互引用的模块。在这种情况下,第一个模块在第二个模块的上下文中是未定义的,因为它还没有完成加载,但是第二个模块可以很好地加载到第一个模块中,因为它在完成加载之前不会解析别名。

    示例 -

    模块 = 插件/moduleOne

    define(['plugins/moduleTwo'], function (hey) {
        console.log(moduleTwo);
    });
    

    模块 = 插件/模块二

    define(['plugins/moduleOne'], function (hey) {
        console.log(moduleOne);
    });
    

    在这种情况下 moduleTwo 正确解析,但 moduleOne 未定义。为了解决这个问题,您可以在第二个模块中使用 require 语句 -

    function checkModule() {
        if (!moduleOne) {
            moduleOne = require('plugins/moduleOne');
        }
    }
    

    然后你可以在你的第二个模块激活之后但在你尝试引用 moduleOne 之前调用这个方法 -

    var moduleOne;
    checkModule();
    moduleOne.doSomething();
    

    【讨论】:

    • 很高兴知道这一点,但是在这种情况下,两个模块都引用了淘汰赛,但仅此而已,它们不会相互引用,因此肯定有其他原因会导致这种行为。跨度>
    • 我知道在某些情况下,如果模块中存在语法错误它不会抛出错误,它会忽略该模块,可能是因为正则表达式吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2017-10-12
    • 2015-12-01
    相关资源
    最近更新 更多