2011-01-12 2 views
0

если я выполняю следующий код, я получаю a не может преобразовать в ошибку объекта; Uncaught исключение: TypeError: Не удается преобразовать '' validation.messages.field на объектне может преобразовать в объект

$.fn.validate = function(validation) { 
    $.each(validation.rules, function(field, fieldRules){ 
     $.each(fieldRules, function(rule, ruleValue){ 
      var fieldValue = $('[name=' + field + ']').val(); 
      if (eval(rule + '(fieldValue, ruleValue)') == false){ 
       alert(validation.rules.field.rule); 
       return false; 
      }else{ 
       return true; 
      }; 
     }); 
    }); 
} 

проблемы является

alert(validation.messages.field.rule);

'поле' = 'persoon_voornaam' и 'правила' = ' требуется ' и validation.messages.persoon_voornaam.required работает отлично.

Что я делаю неправильно?

проверка является JSON, который выглядит следующим образом:

{ 
    rules: { 
     persoon_voornaam: { 
      required: true, 
      minlength: 5, 
     }, 
     postcode_bestemming: { 
      required: true, 
      minlength: 7, 
     }, 
    }, 
    messages: { 
     persoon_voornaam: { 
      required: 'Dit veld is verplicht', 
      minlengt: 'Dit veld moet minstens 5 lang zijn', 
     }, 
    } 
} 
+0

Это недействительно JSON. Misplaced ',' и не использовать '' 'например. – Anders

+0

То, что вы показываете, это не JSON, это литерал объекта. Вероятнее всего, это проблема с завершающим', '. –

+0

' evvvaaaaaaaaaaaaaaaaaaalllllll' noooooo noooooooo не мешает мне , пожалуйста! – jAndy

ответ

1

Он должен быть:

alert(validation.rules[field][rule]) 

Для уточнения:

validation.rules является объектом, а field переменная с строка 'persoon_voornaam'.

validation.rules.persoon_voornaam - это объект и то же, что и validation.rules['persoon_voornaam'].

+0

это, но почему? – dazz

+0

+1 Или вы можете просто использовать параметр значения 'alert (ruleValue)'. – user113716

+1

dazz: validation.rules - это объект, а поле - переменная со строкой 'persoon_voornaam'. validation.rules.persoon_voornaam - это объект и тот же, что и validation.rules ['persoon_voornaam'] - надеюсь, что имеет смысл :) –

1

Ответ на вашу проблему уже дан. Я хочу предложить улучшенную версию вашего кода, чтобы сделать ваш код более многоразовым (в противном случае нет необходимости прикреплять его к объекту jQuery).

  1. Вы не используете тот факт, что эта функция будет применена к элементам, выбранным вашим селектором. Вы выбираете все элементы формы, которые соответствуют определенному имени.
  2. eval is evil. Вам придется загрязнять глобальное пространство имен функциями с именем required и minlength.

Следующий код пытается адресовать эти вопросы:

$.fn.validate = (function() { 
    var validators = { 
     'required': function(value, ruleValue) { 
      /*...*/ 
     }, 
     'minlength': function(value, ruleValue) { 
      /*...*/ 
     } 
    }; 

    return function(validation, config) { 
     return this.each(function() { 
      var errors = []; 
      var $element = $(this); 
      $.each(validation.rules, function(field, fieldRules){ 
       $.each(fieldRules, function(rule, ruleValue){ 
        var fieldValue = $element.find('[name=' + field + ']').val(); 
        if (rule in validators && validators[rule].call(null, fieldValue, ruleValue) === false){ 
         var message = (field in validation.messages && rule in validation.messages[field]) ? validation.messages[field][rule] : ''; 
         errors.push([field, rule, message]) 
         return false; 
        } 
       }); 
      }); 

      // the following part could be written shorter as 
      // var cb = erros.length > 0 ? 'onerror' : 'onsuccess'; 
      // if(typeof config[cb] === 'function') { 
      //  config[cb](errors); 
      // } 
      // but it will pass an empty array to success (which is not a problem 
      // I just though it might be confusing) 

      if(erros.length > 0) { 
       if(typeof config.onerror === 'function') { 
        config.onerror(errors); 
       } 
      } 
      else { 
       if(typeof config.onsuccess === 'function') { 
        config.onsuccess(); 
       } 
      } 
     }); 
    } 
}()); 

Тогда вы можете вызвать функцию с:

$('#yourFormId').validate(valditation, { 
    onerror: function(errors) { 
     // do something with errors 
    }, 
    onsuccess: function() { 
     // do something else 
    } 
}); 

и он будет проверять только поля в форме.

+0

проверяет только поля внутри определенного div, это урезанная версия кода. Но плохо взгляните на альтернативу eval(). Просто использовал его, потому что я не мог найти более подходящую альтернативу. – dazz

+0

@Dazz: Ah ok then: D В любом случае, может быть, мой код дает вам некоторые идеи ... (это непроверено) –

+0

, похоже, работает, за исключением var fieldValue = $ (this) .find ('[name =' + field + ']'). val(); где $ (this) не является объектом, на который вызывается validate. Если я использую $ ('# thedivname'), он работает – dazz

Смежные вопросы