2012-01-25 5 views
6

data- öznitelikleri temel alınarak kurallar eklemeye çalışan jQuery validation eklentisini kullanıyorum. data-minlength veya data-maxlength tabanlı min/maxlength kurallarını ekliyorum. İşte bazı örnek HTML var:Bir döngü içinde veri özelliklerine dayalı jQuery doğrulama kuralları ekleme

<form> 
    <input name="input1" data-maxlength="5" data-minlength="3" required> 
    <input name="input2" data-maxlength="5" required> 
    <input name="input3" data-minlength="3" required> 
    <button>Submit</button> 
</form> 

Kuralları eklemek için yapıyorum ve düzgün şekilde çalışıyorsa:

$('input[data-minlength]').each(function(){ 
    if ($(this).data('minlength')) { 
     $(this).rules("add", { 
      minlength: $(this).data('minlength') 
     }); 
    } 
}); 

$('input[data-maxlength]').each(function(){ 
    if ($(this).data('maxlength')) { 
     $(this).rules("add", { 
      maxlength: $(this).data('maxlength') 
     }); 
    } 
}); 

Ama onu kısaltmak için istedim, bu yüzden bu denenmiş ve işe yaramıyor: $.validator.methods[method] tanımsız olduğu için

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      // alert(item) shows the correct rule name 
      $(this).rules("add", { 
       // Next line fails, but hardcoding a rule name works 
       item: $(this).data(item) 
      }); 
     } 
    }); 
}); 

hatadır. alert(item), kural adının doğru olduğunu söylese bile, bir şekilde yanlış yöntem adı geçiyor.

Yukarıdaki yinelenen, çalışma kodunu kısaltmak için neden kullanabileceğimi veya neden alternatif bir çözüm bulabileceğimi bilen herhangi bir fikri var mı?

Demo: http://jsfiddle.net/kaVKe/1/

cevap

6

Öğe adı verilen yeni bir özelliğe sahip bir nesne hazırlığı oluşturduğunuz için işe yaramıyor.

buna ne dersiniz?

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      // alert(item) shows the correct rule name 
      var options = {}; 
      options[item] = $(this).data(item); 

      $(this).rules("add", options); 
     } 
    }); 
}); 

Bu, bir seçenek nesnesi oluşturur ve ihtiyacınız olan uygun özelliği ekler.

+0

+1 Sadece birkaç saniye oldu ...;) – Yoshi

+0

Teşekkürler, temel bir şey olduğunu biliyordum. Javascript benim güçlü bir nokta değil, hızlı açıklama için teşekkür ederiz. –

3

Neden sadece yapmıyoruz

$('input').each(function(){ 
    var max = $(this).data('maxlength'); 
    var min = $(this).data('minlength') 
    if (min) { 
     $(this).rules("add", { 
      minlength: min 
     }); 
    } 
    if (max) { 
     $(this).rules("add", { 
      maxlength: max 
     }); 
    } 
}); 

keman burada http://jsfiddle.net/kaVKe/2/ Kodunuz için bir özellik adı

için bir değişken kullanamazsınız çünkü bence çalışmıyor
// Next line fails, item is always interpreted as item, not as maxlength/minlength 
item: $(this).data(item) 
+0

teşekkürler. Özniteliğine sahip olup olmadığına bakılmaksızın her girişten döngü oluşturmuyor veya artık daha spesifik bir seçiciden daha yavaş mı oluyor? Sanırım test edip göreceğim. –

+0

@Madmartigan, giriş sayısına bağlıdır, kesinlikle olabilir, ancak özniteliğe göre filtrelemeyi filtreleyerek seçmek de o kadar hızlı değildir. Bir girdi, bu özniteliklerden en az birini hapsedip, bir sınıf sunucu tarafı ekleyebilirdiniz. –

+0

sınıfını kullanarak girdim başka bir yanıt verdim çünkü bence hatamı daha açık bir şekilde vurguladım, ama bu aslında benim kullandığım şey olabilir, çünkü biraz daha incelik gerektiren birkaç başka veri kuralına sahibim. daha fazla girdi arasında geçiş yapması gerekiyor. Belki de bir kez olsun. Çok teşekkürler. –

5

Dene:

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      var rule = {}; 
      rule[item] = $(this).data(item); 
      $(this).rules("add", rule); 
     } 
    }); 
}); 

Çözümün özellik adları değişken olarak yorumlanır olmayacak, çünkü nesne değişmezi gösterimde çalışmıyor: Geçici çözüm için

{ 
    item: ... // <-- this one 
} 
+1

Büyük akıllar hem düşünür! – BNL

+0

Harika çalışıyor, teşekkürler. Benim problemim olan bazı temel javascript olduğunu biliyordum. –