2013-05-20 8 views
9

私の企業環境では、たくさんのJavaScriptが使用されています。すべてこのスクリプトの管理を簡素化し、衝突を付けないようにするために、我々は基本的に名前空間のjavascriptの命名規則を採用:名前空間がすでに存在する場合、Type.registerNamespaceがエラーをスローしています

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スクリプトの出力です)。

ただし、コントロール外のアプリケーション(javascriptプラグイン)で必要となるため、Microsoft Ajaxの名前空間機能を使用するスクリプトもあります。

私は、この宣言を使用:

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: Object Company already exists and is not a namespace

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

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

  • コード全体をマイクロソフトのパターンに移行したくないのですが、それは全く役に立たず読みにくいからです。私はtypescriptに移行するので、名前空間の出力を制御することすらできません。

  • また、Ajaxのものを除外するための代替名前空間を導入したくないのは、すべてのチームに混乱をもたらすからです。

+0

興味がある場合は、def-onceという関数を書きました。それがするのは、名前空間の各部分が登録されているかどうかをチェックし、終了するまでその行を続けます。しかし、構文は少し面白いです。 https://github.com/furiousscissors/OF.Core.js/blob/master/js/of/defonce.js - defOnce( 'CompanyName.ProjectName.Area'、function(){function YourFn(){} return YourFn;}、ウィンドウ); –

+0

@TravisSharp:これは興味深いですが、私はMicrosoft Ajaxのスタイル(ホスティングアプリケーション - SharePointという名前の - この名前空間モデルが必要です)と、TypeScript出力規約に固執しています。とにかく、提案のためにthx –

答えて

1

...数ヶ月後...私は最終的に2つの別々の名前空間を作成しなければなりませんでした。 1つはMS Ajaxリジッドモデル用、1つは自己作成名前空間用です。

CompanyName.ProjectName.Area 
CompanyNameAjax.ProjectName.Area 
0

試してみるといいですか?

try { 
    Type.registerNamespace('CompanyName.ProjectName.Area'); 
} catch(e) { 
    //log it, or just ignore it.. 
} 
+0

残念なことに、このメソッドが呼び出されないか、失敗した場合、Microsoft Ajax OOPのリジッドモデルのため、残りのコードは失敗します。 –

関連する問題