42

RequirejsWebアプリにJavaScriptをロードするために使用しています。問題は、undefinedオブジェクトがモジュールに渡され、他のモジュールで使用されると、完全に正常にインスタンス化されることです。

OK、これがセットアップです。main.jsrequirejsが起動時に実行される私のファイル:

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();
});

この問題では、多くの構成がコアファイルのみに削除されています。

ここにありDemographics.jsます:

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

    // Stuff removed.
    return {
        View: view
    };
});

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
    };
});

問題はこれです-設定を介して渡さComplaints.jsれるdemographicsパラメータではです。コンソールのログアウトにより、「demographics===undefined」はです。defineundefinedtrue

ただし、main.jsファイルが実行されると、渡される人口統計パラメーターは未定義ではなく、予想どおり、インスタンス化されたオブジェクトです。

complaints.jsその人口統計変数が未定義である理由がわからないため、今は行き詰まっています。誰かが私が欠けているものを見つけてもらえますか?

4

6 に答える 6

60

循環依存があります。demographicsモジュールはに依存し、complaintscomplaints依存しdemographicsます。ドキュメントによると:

循環依存関係を定義すると(aにはbが必要で、bにはaが必要)、この場合、bのモジュール関数が呼び出されると、aの未定義の値が取得されます。

循環依存関係を削除できない場合の解決策は、オンデマンドで2つのモジュールの一方を他方のモジュール内に非同期的に要求することです(たとえば、ビューを定義するモジュールが実行されるときではなく、ビューがインスタンス化されるとき)。繰り返しになりますが、ドキュメントはこのトピックをかなりうまくカバーしています。

于 2012-08-16T19:23:07.520 に答える
28

もう1つのケースは、モジュールを定義するときrequireではなく、誤って入力した場合ですdefine。これに気付くのに少し時間がかかりました。

于 2013-04-10T12:25:05.927 に答える
12

私も同様の問題を抱えていました。私の場合、モジュールを定義するときに、次のように記述しました。

define('some_dependency', ...

それ以外の

define(['some_dependency'], ...
于 2013-09-14T12:21:44.957 に答える
4

もう1つの考えられる理由は、モジュールのインターフェイス(AMD、CommonJS)を実装しているが、何も返さないことです。私はそれをしました。

于 2014-07-01T19:28:36.230 に答える
1

私はちょうど別の理由に遭遇しました:

define(function () {
    return {};
}()); // <-- notice the '()' typo.

この「タイプミス」は、これに対してJSエラーを引き起こさず、特に多くの潜在的な循環依存関係がある複雑なアプリケーションで理解するのを混乱させる可能性があります。

define()もちろん、その理由は、「タイプミス」が有効なJSであり、定義した関数を呼び出すだけで、意図したとおりの関数ではなく、その結果を渡すためです。

于 2017-03-02T16:55:03.543 に答える
0

後から明らかと思われるもう1つの考えられる理由は、モジュールのコードのエラーです。私の場合、未定義の変数から属性を取得しようとしていました。エラーはコンソールに記録されますが、何らかの理由でエラーが表示されなかった/未定義のモジュールエラーと間違えました。

于 2016-03-22T20:20:01.913 に答える