2011-10-10 5 views
6

Se avessi qualcosa di simile:Come eseguire una funzione JavaScript che è all'interno di uno spazio dei nomi

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 
       }); 
      } 
     } 
    } 
}; 

Come dovrei eseguire una delle funzioni interne?

App.editingMode(); ma allora cosa dovrei fare per arrivare allo setEditingMode ??

+2

AFAIK quelle funzioni sono effettivamente private, non è possibile. –

risposta

0

Si avrebbe bisogno di restituire un riferimento a una o altrimenti rendere accessibile dall'esterno della funzione, ad esempio, collegandolo a window (efficacemente rendendolo un globale) o l'oggetto App.

+0

Hmm mi chiedo perché preoccuparmi di Namespacing? – Cameron

+0

@Cameron Namespacing è ancora una buona idea. È meglio avere solo "App" globale, quindi avere dozzine di funzioni, oggetti, ecc. Globali. – alex

8

È possibile utilizzare una struttura diversa per ottenere ciò che si desidera. Non so se romperebbe qualcos'altro che stai usando, quindi ti faccio solo un esempio. Non sono sicuro che questa sia la soluzione, per favore dai un'occhiata e dimmi se non è quello che ti serve. Se si utilizza:

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 
          }); 
         } 
        } 
       } 
      }; 

è possibile chiamare i metodi di EditingMode come questo:

App.editingMode.setEditingModeOff(1); 

notare che essi saranno ancora incapsulati all'interno App, voi non necessariamente li passare alla portata globale.

+0

Immagino che funzionerebbe. Ma quasi mi chiedo perché preoccuparmi del namespace:/ – Cameron

+1

È sempre utile, non penso di poter elencare i benefici nel numero di caratteri consentiti in un commento. Quando hai un grande progetto con dozzine di oggetti con dozzine di metodi, ecc. Apprezzerai il namespaces :) – Nikoloff

0

Sebbene la risposta fornita da "Nikoloff" consenta di chiamare tali funzioni, ma vorrei sottolineare un approccio leggermente diverso (e probabilmente migliore). Il seguente concetto di modello "Modulo" non solo risolverà il problema in modo efficace, ma consentirà anche di avere variabili private. (Cerca 'Modello modulo in Javascript' e ti darà un sacco di risorse online.)

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()); 
Problemi correlati