9

私の企業環境では、多くの JavaScript を使用しています。このすべてのスクリプトの管理を簡素化し、名前の競合を回避するために、名前空間に JavaScript の命名規則を採用しました。これは基本的に次のとおりです。

CompanyName.ProjectName.Area.XYZ.js

名前空間を作成するために、次のパターンを使用しています。

var Company;
(function (Company) {
    (function (Project) {
        (function (Area) {
            (function (XYZ) {

                function function1(args) {

                },
                function function2(args) {

                }
            })(Area.XYZ|| (Area.XYZ = {}));

        })(Project.Area || (Project.Area = {}));
        var Area = Project.Area;
    })(Company.Project || (Company.Project = {}));
    var Project = Company.Project;
})(Company || (Company = {}));

これは問題なく動作します (実際、これは TypeScript スクリプトの出力です)。

ただし、Microsoft Ajax 名前空間関数を使用するスクリプトもいくつかあります。これは、制御不能なアプリケーション (javascript プラグイン) で必要になるためです。

私はこの宣言を使用します:

Type.registerNamespace('CompanyName.ProjectName.Area');
CompanyName.ProjectName.Area.ABC = function() {
}
CompanyName.ProjectName.Area.ABC.prototype = {
    function1 : function (args) {

    },
    function2 : function (args) {

    }
}

しかし、への呼び出しType.registerNamespaceはエラーをスローします:

Sys.InvalidOperationException: オブジェクトCompanyは既に存在し、名前空間ではありません

どうすれば両方の世界を適切に組み合わせることができますか? 問題を解決して警告を消すにはどうすればよいですか?

  • アプリケーションによって動的に生成されるため、スクリプトを含める順序を制御できません。

  • コード全体を Microsoft のパターンに移行したくありません。これは非常に役に立たず、読みにくいからです。typescript に移行すると、名前空間の出力を制御することさえできなくなります。

  • また、Ajax の名前空間を除外する別の名前空間を導入したくありません。チーム全体に混乱をもたらすからです。

4

2 に答える 2

1

数か月後... ついに 2 つの別々の名前空間を作成する必要がありました。1 つは MS Ajax リジッド モデル用、もう 1 つは自己作成の名前空間用です。

CompanyName.ProjectName.Area
CompanyNameAjax.ProjectName.Area
于 2014-09-24T09:37:32.030 に答える
-1

あなたはそれを試したり捕まえたりすることはできませんか?

try {
  Type.registerNamespace('CompanyName.ProjectName.Area');
} catch( e ) {
   //log it, or just ignore it..
}
于 2013-06-06T10:35:05.717 に答える