2009-06-23 25 views
48

Tôi có chức năng sau.Làm cách nào để viết chức năng jquery chấp nhận gọi lại làm tham số

function ChangeDasPanel(controllerPath, postParams) { 

    $.post(controllerPath, postParams, function(returnValue) { 

     $('#DasSpace').hide("slide", { direction: "right" }, 1000, function() { 

      $('#DasSpace').contents().remove(); 

      $('#DasSpace').append(returnValue).css("display", "block"); 

      $('#DasSpace').show("slide", { direction: "right" }, 1000); 

     }); 

    }); 

}; 

Nhưng tôi muốn để có thể gọi nó như

ChangeDasPanel("../Home/Test", {} ,function(){ 
    //do some stuff on callback 
} 

Làm thế nào tôi có thể thực hiện hỗ trợ này cho callbacks trong chức năng của tôi?

Trả lời

75
function ChangeDasPanel(controllerPath, postParams, f) { 
    $.get(
    controllerPath, 
    postParams, 
    function(returnValue) { 
     var $DasSpace = $('#DasSpace'); 
     $DasSpace.hide(
     "slide", { direction: "right" }, 1000, 
     function() { 
      $DasSpace.contents().remove(); 
      $DasSpace.append(returnValue).css("display", "block"); 
      $DasSpace.show("slide", { direction: "right" }, 1000); 
     } 
    ); 
     if (typeof f == "function") f(); else alert('meh'); 
    } 
); 
}; 

Bạn có thể chuyển các chức năng như bất kỳ đối tượng nào khác trong JavaScript. Việc chuyển tiếp trong một hàm gọi lại là thẳng về phía trước, thậm chí bạn có thể tự thực hiện trong cuộc gọi $.post().

Bạn có thể quyết định có muốn gọi lại gọi là một phần của cuộc gọi lại $.post() hay không.

+0

chính xác những gì tôi đã cố gắng làm trong 30 phút qua. Cảm ơn! đã giúp tôi ra –

+0

Cảm ơn bạn đã viết "if (typeof f ==" function ") f();" một phần. Tôi đã tìm kiếm điều đó! – Garavani

14

Nếu tôi hiểu bạn một cách chính xác, đó là dễ dàng như việc thiết lập thông số khác và kêu gọi các biến như một chức năng:

function foo(mycallback) { 
    mycallback(); 
} 
11

Tại sao bạn không sử dụng một đối tượng mà bạn có thể đi qua để hàm. Nó giống jQuery nhiều hơn và nó giúp bạn tiết kiệm các tham số x có tên là khó duy trì vì nó có thể khó sử dụng khi bạn nhận được 3 tham số trong quá khứ.

ví dụ

function callingFunction(){ 

     var fnSettings: { 
     url: someUrl, 
     data: params, 
     callback : function(){} 
     }; 


     yourFunction(fnSettings); 

} 

function yourFunction(settings) { 

     $.post(settings.url, settings.data, settings.callback); 

} 
+0

Điều này chắc chắn là câu trả lời rõ ràng nhất (tôi đã viết một cái gì đó tương tự, vì vậy tôi có thể thiên vị) – arviman

22

Bạn biết rằng các biến và chức năng toàn cầu là ác, vậy tại sao không đặt của bạn vào không gian tên jQuery:

$.extend({ 
    myFunc : function(someArg, callbackFnk){ 
    var url = "http://example.com?q=" + someArg; 
    $.getJSON(url, function(data){ 

     // now we are calling our own callback function 
     if(typeof callbackFnk == 'function'){ 
     callbackFnk.call(this, data); 
     } 

    }); 
    } 
}); 

$.myFunc(args, function(){ 
    // now my function is not hardcoded 
    // in the plugin itself 
}); 

đã đọc bài này để có được một sự hiểu biết tốt hơn: Creating callback functions in jQuery

+0

Cool. Làm thế nào tôi có thể tạo ra chức năng nặc danh như trong Jquery chính nó '$ .hide (555, function()) {})' ?? Hoặc callbackFnk là câu trả lời? – aleXela

+0

Yeap, 'callbackFnk' chỉ là một biến cục bộ. Như bạn có thể thấy trong ví dụ này, chúng ta đang truyền một hàm ẩn danh: '$ .myFunc (args, function() {})'. – Uzbekjon

+0

Cảm ơn một lần nữa! Một câu hỏi nữa, nó sẽ cháy sau khi kết thúc func chính? – aleXela

Các vấn đề liên quan