2011-10-10 94 views
6

內如果我有這樣的事情:如何運行的JavaScript函數是一個命名空間

App = { 
    editingMode: function() 
    { 
     function setEditingMode(entityID) { 
      $('#editingMode').val('1'); 
      $.ajax({ 
       type: "POST", 
       url: "/Organisations/Manage/LockEntity/", 
       data: "entityID=" + entityID 
      }); 
     } 
     function setEditingModeOff(entityID) { 
      if ($("#myform").valid() == true) 
      { 
       $('#editingMode').val('0'); 
       $.ajax({ 
        type: "POST", 
        url: "/Organisations/Manage/UnlockEntity/", 
        data: "entityID=" + entityID 
       }); 
      } 
     } 
    } 
}; 

我將如何運行的內部功能之一?

App.editingMode();但是那麼我該怎麼做才能得到setEditingMode

+2

AFAIK這些功能是有效的私人,你不能。 –

回答

0

您需要返回一個引用或從其他位置訪問該引用,例如將其附加到window(有效地使其成爲全局對象)或App對象。

+0

嗯讓我想知道爲什麼要打擾命名空間? – Cameron

+0

@Cameron命名空間仍然是一個好主意。最好只有'App'全局,然後有幾十個全局函數,對象等。 – alex

8

你可以使用不同的結構來完成你想要的。我不知道它是否會破壞你正在使用的其他東西,所以我只給你一個例子。我不確定這是否是實際的解決方案,請看看並告訴我,如果這不是您需要的。 如果你使用:

var App = { 
       editingMode: 
       { 
        setEditingMode: function(entityID) { 
         $('#editingMode').val('1'); 
         $.ajax({ 
          type: "POST", 
          url: "/Organisations/Manage/LockEntity/", 
          data: "entityID=" + entityID 
         }); 
        }, 
        setEditingModeOff: function(entityID) { 
         if ($("#myform").valid() == true) 
         { 
          $('#editingMode').val('0'); 
          $.ajax({ 
           type: "POST", 
           url: "/Organisations/Manage/UnlockEntity/", 
           data: "entityID=" + entityID 
          }); 
         } 
        } 
       } 
      }; 

可以調用editingMode的方法是這樣的:

App.editingMode.setEditingModeOff(1); 

注意,他們將仍然在應用程序被封裝,你不必將它們移動到全球範圍內。

+0

我想這會起作用。但它幾乎讓我想知道爲什麼要打擾命名空間:/ – Cameron

+1

它總是很有用,我不認爲我可以在評論中允許的字符數中列出好處。當你有一個大型的項目與數十個方法等幾十個對象,你會明白namespacing :) – Nikoloff

0

雖然'Nikoloff'給出的答案可以讓你調用這些函數,但我會指出有點不同(也許更好)的方法。 以下「模塊」模式概念不僅能有效解決您的問題,而且還允許您擁有私有變量。 (搜索'模塊模式在Javascript',它會給你大量的在線資源。)

App = { 
    editingMode: function() 
    {  
     // Below var is no way directly accessible and act as private var 
     var privateVar =5; 
     // Below function is going to give access to private var 
     function getPrivateVar(){ 
      return privateVar; 
     } 
     //Your functions - untouched 
     function setEditingMode(entityID) { 
      $('#editingMode').val('1'); 
      $.ajax({ 
       type: "POST", 
       url: "/Organisations/Manage/LockEntity/", 
       data: "entityID=" + entityID 
      }); 
     } 
     function setEditingModeOff(entityID) { 
      if ($("#myform").valid() == true) 
      { 
       $('#editingMode').val('0'); 
       $.ajax({ 
        type: "POST", 
        url: "/Organisations/Manage/UnlockEntity/", 
        data: "entityID=" + entityID 
       }); 
      } 
     } 
     return { 
      setEditingMode: setEditingMode, 
      setEditingModeOff: setEditingModeOff, 
      getPrivateVar: getPrivateVar 
     } 
    } 
}; 

App.editingMode().setEditingMode(); 
console.log(App.editingMode().getPrivateVar()); 
相關問題