2013-03-26 17 views
0

this link我創建了一個命名空間,我的對象有:如何通過jQuery的無衝突到我已經放在一個命名空間中的物體

var Namespace = 
{ 
    Register : function(_Name) 
    { 
    var chk = false; 
    var cob = ""; 
    var spc = _Name.split("."); 
    for(var i = 0; i<spc.length; i++) 
    { 
     if(cob!=""){cob+=".";} 
     cob+=spc[i]; 
     chk = this.Exists(cob); 
     if(!chk){this.Create(cob);} 
    } 
    if(chk){ throw "Namespace: " + _Name + " is already defined."; } 
    }, 

    Create : function(_Src) 
    { 
    eval("window." + _Src + " = new Object();"); 
    }, 

    Exists : function(_Src) 
    { 
    eval("var NE = false; try{if(" + _Src + "){NE = true;}else{NE = false;}}catch(err){NE=false;}"); 
    return NE; 
    } 
} 

定義對象:

Namespace.Register("System.Classes.HelloWorld"); 

System.Classes.HelloWorld = function(aa){ return { 

    Message : "Hello World!", 

    Hello : function(a,b) 
    { 
     alert(this.Message + a + b); 
    } 

};} 

哪有我將jQuery NoConflict傳遞給這個對象並允許我使用$符號?

例如this article創建了一個類似的對象,只是通過jQuery NoConflict以我無法應用於上述代碼的方式傳遞。

此代碼包裝jQuery的NoConflict,並允許我想其中的美元符號複製:

(function(skillet, $, undefined) { 
    //Private Property 
    var isHot = true; 

    //Public Property 
    skillet.ingredient = "Bacon Strips"; 

    //Public Method 
    skillet.fry = function() { 
     var oliveOil; 

     addItem("\t\n Butter \n\t"); 
     addItem(oliveOil); 
     console.log("Frying " + skillet.ingredient); 
    }; 

    //Private Method 
    function addItem(item) { 
     if (item !== undefined) { 
      console.log("Adding " + $.trim(item)); 
     } 
    }  
}(window.skillet = window.skillet || {}, jQuery)); 
+0

你可以用同樣的方法做到這一點......究竟是什麼問題?如果你解釋*你在哪裏訪問jQuery,這可能會有所幫助。 – 2013-03-26 21:34:21

+0

System.Classes.HelloWorld對象內部。這個想法是,對象自動訪問jQuery $,所以我們最好傳入Namespace函數本身的No Conflict參數。順便說一句,我怎樣才能以同樣的方式做到這一點?我已經嘗試將較低的代碼轉換爲中間代碼的較低部分代碼,但無濟於事。 – 2013-03-27 11:03:50

回答

0

你可能想嘗試這種模式:

var Namespace = (function($) { 
    //Private members 
    var register = function(_Name) { 
     //... 
    }; 
    var create = function(_Src) { 
     //... 
    }; 
    var exists = function(_Src) { 
     //... 
    }; 

    //Expose public members 
    return { 
     register : register, 
     create : create, 
     exists : exists 
    }; 
})(jQuery); 

這不僅允許各種私人成員進行定義,但也避免了以Namespace.this.作爲內部函數調用的前綴。

+0

謝謝,我已經採取了上述並從原來的命名空間函數插入的行,你已經評論// ...但代碼然後拋出 - TypeError:Namespace.Register不是一個函數 [Break On This Error] \t var a = System.Classes.HelloWorld(1); – 2013-03-27 11:25:50

+0

你知道什麼可能是錯的嗎?歡呼聲 – 2013-03-27 11:26:09

+0

它是'Namespace.register'。按照慣例,方法不會大寫。 – 2013-03-27 13:07:02