2011-10-10 28 views
6

Si tuviera algo como:cómo ejecutar una función de JavaScript que se encuentra dentro de un espacio de nombres

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

¿Cómo puedo ejecutar una de las funciones internas?

App.editingMode(); pero entonces, ¿qué haría para llegar al setEditingMode ??

+2

AFAIK esas funciones son efectivamente privadas, no puede. –

Respuesta

0

Debería devolver una referencia a una o hacerla accesible desde fuera de la función, por ejemplo, adjuntándola a window (efectivamente haciéndolo global) o al objeto App.

+0

Hmm me hace preguntarme ¿por qué molestarse con Namespacing? – Cameron

+0

@Cameron Namespacing sigue siendo una buena idea. Es mejor tener solo 'App' global y tener docenas de funciones globales, objetos, etc. – alex

8

Puede utilizar una estructura diferente para lograr lo que desea. No sé si rompería algo más que estás usando, así que solo te daré un ejemplo. No estoy seguro de que esta sea la solución real, eche un vistazo y dígame si eso no es lo que necesita. Si utiliza:

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

se puede llamar a los métodos de EditingMode así:

App.editingMode.setEditingModeOff(1); 

en cuenta que todavía se encapsulan dentro de la aplicación, que no necesariamente se les mueva al ámbito global.

+0

Supongo que funcionaría. Pero casi me hace preguntarme por qué molestarse con el espacio de nombres en absoluto:/ – Cameron

+1

Siempre es útil, no creo que pueda enumerar los beneficios en la cantidad de caracteres permitidos en un comentario. Cuando tenga un proyecto grande con docenas de objetos con docenas de métodos, etc. apreciará el espacio de nombres :) – Nikoloff

0

Aunque la respuesta dada por 'Nikoloff' le permite llamar a esas funciones, pero señalaría un enfoque diferente (y probablemente mejor) diferente. Seguir el concepto de patrón 'Módulo' no solo resolverá su problema de manera efectiva sino que también le permitirá tener variables privadas. (Busque 'Patrón de módulo en Javascript' y le dará muchos recursos en línea.)

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()); 
Cuestiones relacionadas