未定义的对象通过Requirejs传递

Jas*_*ans 42 javascript requirejs

我正在使用Requirejs我们的网络应用程序加载JavaScript.问题是我正在将一个undefined对象传递给一个模块,当在其他模块中使用时,该模块被完美地实例化.

好的,这是设置.我的main.js文件requirejs在启动时运行:

require.config({
    baseUrl: "/scripts",
    paths: {
        demographics: "Demographics/demographics",
        complaints: "Complaints/complaints",
    }
});

require(["templates", "demographics", "complaints", "crossDomain"], function (templates, demographics, complaints) {
    "use strict";

    console.log("0");
    console.log(demographics === undefined);

    demographics.View.display();
});
Run Code Online (Sandbox Code Playgroud)

很多配置都被剥离到这个问题中的核心文件.

这是Demographics.js:

define(["ko", "templates", "complaints", "globals", "underscore"], function (ko, templates, complaints, globals) {

    // Stuff removed.
    return {
        View: view
    };
});
Run Code Online (Sandbox Code Playgroud)

Complaints.js

define([
    "demographics",
    "ko",
    "templates",
    "complaints",
    "visualeffects",
    "globals",
    "webservice",
    "underscore",
    "typewatcher",
    "imagesloaded"],
    function (demographics, ko, templates, complaints, visualeffects, globals, webservice) {
        "use strict";


        console.log("1");
        console.log(demographics === undefined);
    return {
        View: view
    };
});
Run Code Online (Sandbox Code Playgroud)

问题是这个 - 在通过配置传递Complaints.jsdemographics参数defineundefined.控制台注销告诉我"人口统计数据=== undefined"是true.

但是,当main.js文件执行时,传递给它的demographics参数不是未定义的,正如预期的那样,它是一个实例化的对象.

现在我陷入困境,因为我无法complaints.js理解为什么人口统计信息变量未定义.有人能发现我想念的东西吗?

rha*_*per 60

你有一个循环依赖.该demographics模块取决于complaintscomplaints依赖于demographics.根据文件:

如果定义循环依赖(需要b和b需要a),那么在这种情况下调用b的模块函数时,它将获得a的未定义值.

如果无法删除循环依赖关系,则解决方案是根据需要异步地要求另一个模块中的一个(例如,在实例化视图时,而不是在执行定义视图的模块时).同样,文档很好地涵盖了这个主题.


Mis*_*lin 28

另一种情况是当你不小心打字require而不是define定义模块时,花了一些时间注意这一点.


Joe*_*oel 11

我遇到了类似的问题.就我而言,在定义模块时,我写道:

define('some_dependency', ...
Run Code Online (Sandbox Code Playgroud)

代替

define(['some_dependency'], ...
Run Code Online (Sandbox Code Playgroud)