2011-02-08 18 views
7
$.ajax({ 
    url : uri, 
    type : 'post', 
    data : {someBooleanVar1: false, subVar: {someBooleanVar2: true}} 
}); 

sorun sunucu someBooleanVar1 ve someBooleanVar2 üzerinde dizeleri olarak kabul edilecek olmasıdır "1" "yanlış" ve "gerçek" değil, "0" olarak ve. otomatik olarak boole argümanlarını "1" ve "0" 'a dönüştürmenin bir yolu var mı?jQuery.ajax() ve gönderme boole istek argümanlar

cevap

2

@jcubic Yanıt sabit bir sürümü var. Ajax'ı çağırırsanız ve veri setiniz yoksa bir hata verir. Booleanları dönüştürmeden önce veri özelliğinin ayarlanıp ayarlanmadığını görmek için bir test eklendi. Ben bu yazı biraz eski biliyorum ...

function convertBoolToNum(obj) { 
    $.each(obj, function(i) { 
    if (typeof obj[i] == 'object') { 
     convertBoolToNum(this); 
    } 
    else if (typeof obj[i] == 'boolean') { 
     obj[i] = Number(obj[i]); 
    } 
    }); 
} 

$.ajax = (function($ajax) { 
    return function(options) { 
    if (_.has(options, 'data')) { 
     convertBoolToNum(options.data); 
    } 
    return $ajax(options); 
    }; 
})($.ajax); 
0

Gerçekten otomatik ancak 0 veya 1 olarak boole dönüştürecektir 0 ekleyerek:

data : {someBooleanVar1: false + 0, someBooleanVar2: true + 0} 
+0

Bu yüzden her seferinde boole olabilecek bazı argümanları iletmem gerekecek mi? Hayır teşekkürler! – barbushin

+0

@Senior Ne bekliyorsunuz? Booleanların 1 veya 0 olmasına neden olacak bir çeşit global JS ayarı? –

+1

Bu dava için jQuery'de bazı çok özel seçenekler/yöntemler vardır. Bu dönüşümü otomatik olarak yapabilen kısa bir javascript kodu olabilir. – barbushin

1

bu deneyin, otomatik veri seçeneklerinde numaralar boolean için değerleri dönüştürmek gerekir.

function convertBoolToNum(obj) { 
    $.each(obj, function(i) { 
     if (typeof obj[i] == 'object') { 
      convertBoolToNum(this); 
     } 
     else if (typeof obj[i] == 'boolean') { 
      obj[i] = Number(obj[i]); 
     } 
    }); 
} 

$.ajax = (function($ajax) { 
    return function(options) { 
    convertBoolToNum(options.data); 
    return $ajax(options); 
    }; 
})($.ajax); 
+0

sayılır Çok iyi bir fikir! Dönüşüm nesnesinin özyineli olmadığı tek bir hata vardır, bu nedenle {var: {subVar: false}} ile çalışmaz. Onu tamir ettim, aşağıda cevap ver. – barbushin

0

Bu Yi Jiang yanıtı için bir düzeltmedir:

$.ajax = (function($ajax) { 
    return function(options) { 
    if (options.data != undefined) { 
     for (var i in options.data) { 
      if (options.data.hasOwnProperty(i) && 
       (typeof options.data[i] == "boolean")) { 
      options.data[i] = Number(options.data[i]); 
      } 
     } 
    }   
    return $ajax(options); 
    }; 
})($.ajax); 
1

yerli js fonksiyonu hasownprop ile takas etmek çekinmeyin ama yine de ben php için değişkenler geçmesi bu bilgileri ^^ pas vermek istedi çizgi kullanılır ve onları yakalamak i Boolean true=1 ve dize olarak yanlış false= dizeleri çevirmek böyle

filter_var($var, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); 

php

boştur

belki de yanlış soruyu okurum. ama anladığım kadarıyla :) yukarıdaki kodu kullanarak bir işlevi kolayca oluşturabilir ve her şeyi istediğiniz gibi çalıştırabilmek için daha fazla filtre ekleyebilirsiniz :)

0

Genel ad alanını kirletmeyen daha da optimize edilmiş bir sürüm. , değerleri yinelemeli olarak dönüştürür, potansiyel tanımsız veri özelliğine bakar ve boolean değerlerini karşılık gelen tamsayı değerlerine dönüştürmek için uygun yöntemi kullanır.

$.ajax = (function($ajax) { 
    return function(options) { 
     (function (obj) { 
      var _fn = arguments.callee; 
      $.each(obj, function(i) { 
       if (typeof obj[i] == 'object') { 
        _fn(this); 
       } else if (typeof obj[i] == 'boolean') { 
        obj[i] = ~~obj[i]; 
       } 
      }) 
     })(options.data || {}); 
     return $ajax(options); 
    }; 
})($.ajax);  

Bunun hala istek göndermeden önce jQuery tarafından dahili olarak gerçekleştirilmesinin oldukça şaşırtıcı olduğunu düşünüyorum.