[javascript] jQuery تمرير المزيد من المعلمات إلى معاودة الاتصال


6 Answers

عند استخدام doSomething(data, myDiv) ، فإنك تقوم بالفعل باستدعاء الوظيفة ولا تقوم بالإشارة إليها.

يمكنك إما تمرير وظيفة doStomething مباشرة ولكن يجب التأكد من أن لديها التوقيع الصحيح.

إذا كنت ترغب في الحفاظ على القيام بشيء كما هو ، يمكنك التفاف دعوته في وظيفة مجهولة.

function clicked() {
    var myDiv = $("#my-div");
    $.post("someurl.php",someData, function(data){ 
      doSomething(data, myDiv)
    },"json"); 
}

function doSomething(curData, curDiv) {
    ...
}

داخل رمز الدالة المجهول ، يمكنك استخدام المتغيرات المحددة في نطاق التضمين. هذه هي الطريقة التي يعمل بها scoping في جافا سكريبت.

Question

هل هناك طريقة لتمرير المزيد من البيانات إلى وظيفة رد اتصال في jQuery؟

لدي وظيفتان وأريد إعادة الاتصال إلى $.post ، على سبيل المثال ، لتمرير كل من البيانات الناتجة لمكالمة AJAX ، بالإضافة إلى بعض الحجج المخصصة

function clicked() {
    var myDiv = $("#my-div");
    // ERROR: Says data not defined
    $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
    // ERROR: Would pass in myDiv as curData (wrong)
    $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
}

function doSomething(curData, curDiv) {

}

أريد أن أتمكن من تمرير المعلمات الخاصة بي إلى معاودة الاتصال ، بالإضافة إلى النتيجة التي يتم إرجاعها من مكالمة AJAX.




يمكنك استخدام إغلاق JavaScript:

function wrapper( var1, var2,....) // put here your variables
{
  return function( data, status)
  {
     //Handle here results of call
  }
};

ومتى يمكنك:

$.post("someurl.php",data,wrapper(var1, var2, etc...),"html");



إذا كان شخص ما لا يزال يأتي هنا ، فهذه هي نصيبي:

$('.selector').click(myCallbackFunction.bind({var1: 'hello', var2: 'world'}));

function myCallbackFunction(event) {
    var passedArg1 = this.var1,
        passedArg2 = this.var2
}

ما يحدث هنا ، بعد الربط لوظيفة رد الاتصال ، سيكون متاحًا داخل الوظيفة this .

تأتي هذه الفكرة من كيفية استخدام React لوظيفة bind .




في عالم اليوم ، هناك إجابة أخرى أكثر نظافة ، ويتم أخذها من إجابة أخرى من :

function clicked()
{
    var myDiv = $( "#my-div" );

    $.post( "someurl.php", {"someData": someData}, $.proxy(doSomething, myDiv), "json" );
}

function doSomething( data )
{
    // this will be equal to myDiv now. Thanks to jQuery.proxy().
    var $myDiv = this;

    // doing stuff.
    ...
}

وهنا السؤال الأصلي والجواب: مسج : كيف؟ تمرير المعلمات الإضافية لاستدعاء النجاح لمكالمة .ajax $.




لنذهب بسيط! :)

$.ajax({
    url: myUrl,
    context: $this, // $this == Current $element
    success: function(data) {
        $.proxy(publicMethods.update, this)(data); // this == Current $element
    }
});



بالنسبة لي ، ونوبيين آخرين اتصلوا للتو بـ Javascript ،
أعتقد أن Closeure Solution هو نوع صغير من الارتباك.

في حين وجدت ذلك ، يمكنك بسهولة تمرير العديد من المعلمات على النحو الذي تريد كل رد الاتصال بأيجاكس باستخدام مسج.

فيما يلي حلان أسهل .

الأولى ، التي ذكرها zeroasterisk أعلاه ، مثال:

var $items = $('.some_class');
$.each($items, function(key, item){
    var url = 'http://request_with_params' + $(item).html();
    $.ajax({
        selfDom     : $(item),
        selfData    : 'here is my self defined data',

        url         : url,
        dataType    : 'json',
        success     : function(data, code, jqXHR){
            // in $.ajax callbacks, 
            // [this] keyword references to the options you gived to $.ajax
            // if you had not specified the context of $.ajax callbacks.
            // see http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings context
            var $item = this.selfDom;
            var selfdata = this.selfData;
            $item.html( selfdata );
            ...
        } 
    });
});

الثاني ، تمرير datas self-defined-datas بإضافتها إلى XHR object موجود في كامل عمر طلب استجابة ajax.

var $items = $('.some_class');
$.each($items, function(key, item){
    var url = 'http://request_with_params' + $(item).html();
    $.ajax({
        url         : url,
        dataType    : 'json',
        beforeSend  : function(XHR) {
            // 为了便于回调,把当前的 jquery对象集存入本次 XHR
            XHR.selfDom = $(item);
            XHR.selfData = 'here is my self defined data';
        },
        success     : function(data, code, jqXHR){
            // jqXHR is a superset of the browser's native XHR object
            var $item = jqXHR.selfDom;
            var selfdata = jqXHR.selfData;
            $item.html( selfdata );
            ...
        } 
    });
});

كما يمكنك رؤية هذين الحلين له عيب: تحتاج إلى كتابة رمز أكثر قليلاً في كل مرة من مجرد كتابة:

$.get/post (url, data, successHandler);

قراءة المزيد عن $ .ajax: http://api.jquery.com/jquery.ajax/




في الواقع ، لا يعمل الرمز الخاص بك لأنه عندما تكتب:

$.post("someurl.php",someData,doSomething(data, myDiv),"json"); 

يمكنك وضع استدعاء دالة كمعلمة ثالثة بدلاً من مرجع دالة .




Related