AMD模块未加载,未定义

时间:2013-12-20 21:23:29

标签: durandal

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

define(['plugins / http','durandal / app','knockout','plugins / ajax','plugins / formatters'],函数(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配置有什么问题,或者是什么,这是否发生在其他任何模块未定义的模块上?这意味着什么?

请帮忙。谢谢!

1 个答案:

答案 0 :(得分:0)

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

示例 -

module = plugins / moduleOne

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

module = plugins / 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();