2011-10-10 24 views
6

Nếu tôi có một cái gì đó như:Làm thế nào để chạy một hàm JavaScript có nghĩa là bên trong một không gian tên

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

Làm thế nào tôi sẽ chạy một trong những chức năng bên trong?

App.editingMode(); nhưng sau đó tôi sẽ làm gì để nhận được tại setEditingMode ??

+2

AFAIK những chức năng này là riêng tư hiệu quả, bạn không thể. –

Trả lời

0

Bạn cần phải trả về một tham chiếu đến một hoặc làm cho nó có thể truy cập từ bên ngoài của hàm, ví dụ, đính kèm nó vào window (làm cho nó thành toàn cầu) hoặc đối tượng App.

+0

Hmm khiến tôi tự hỏi tại sao lại bận tâm với Không gian tên? – Cameron

+0

@Cameron Không gian tên vẫn là một ý tưởng hay. Sẽ tốt hơn nếu chỉ có 'App' toàn cầu sau đó có hàng chục chức năng, đối tượng toàn cầu, v.v. – alex

8

Bạn có thể sử dụng cấu trúc khác để hoàn thành những gì bạn muốn. Tôi không biết nếu nó sẽ phá vỡ cái gì khác bạn đang sử dụng, vì vậy tôi sẽ chỉ cung cấp cho bạn một ví dụ. Tôi không chắc đây là giải pháp thực sự, hãy xem và cho tôi biết nếu đó không phải là những gì bạn cần. Nếu bạn sử dụng:

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

bạn có thể gọi các phương thức editingMode của như thế này:

App.editingMode.setEditingModeOff(1); 

Thông báo rằng họ sẽ vẫn được gói gọn trong phạm vi ứng dụng, bạn không nhất thiết chuyển chúng sang phạm vi toàn cầu.

+0

Tôi đoán điều đó sẽ hiệu quả. Nhưng nó gần như làm cho tôi tự hỏi tại sao bận tâm với các không gian tên ở tất cả:/ – Cameron

+1

Nó luôn luôn hữu ích, tôi không nghĩ rằng tôi có thể liệt kê những lợi ích trong số lượng ký tự được cho phép trong một bình luận. Khi bạn có một dự án lớn với hàng chục đối tượng với hàng tá phương thức, v.v. – Nikoloff

0

Mặc dù câu trả lời được đưa ra bởi 'Nikoloff' cho phép bạn gọi những chức năng đó nhưng tôi sẽ chỉ ra cách tiếp cận khác nhau (và có lẽ tốt hơn). Sau khái niệm mẫu 'Mô-đun' sẽ không chỉ giải quyết vấn đề của bạn một cách hiệu quả mà còn cho phép bạn có các biến riêng tư. (Tìm kiếm 'Mô-đun mô-đun trong Javascript' và nó sẽ cung cấp cho bạn vô số tài nguyên trực tuyến.)

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()); 
Các vấn đề liên quan