2013-05-20 35 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腳本的輸出)。

但是,我也有一些使用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: Object Company already exists and is not a namespace

我怎樣才能正確地結合兩者的優點?我如何解決我的問題並使警告消失?

  • 我無法控制腳本包含的順序,因爲它是由應用程序動態生成的。

  • 我不想將整個代碼遷移到微軟的模式,因爲它很無用而且很難閱讀。而當我遷移到打字稿時,我甚至無法控制命名空間輸出。

  • 我也不想引入另一個命名空間來排除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;},window); –

+0

@TravisSharp:這聽起來很有趣,但我堅持使用Microsoft Ajax的風格(因爲託管應用程序 - 要命名的SharePoint--需要此名稱空間模型)並且還堅持使用TypeScript輸出約定。 thx對於暗示 –

回答

1

幾個月後......我終於必須創建兩個獨立的命名空間。一個用於MS Ajax剛性模型,一個用於自創名稱空間。

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的剛性模型,其餘的代碼將會失敗。 –

相關問題