2012-10-09 99 views
2

我想创建一个对象,其第一个属性是一个函数,用于确定父对象访问哪个子对象。我的具体应用是根据提交的表单类型来改变表单验证的类型。将函数分配给JSON属性

错误消息我得到在页面加载我是:Uncaught TypeError: Cannot set property 'validate' of undefined

这里是我的JavaScript至今(这里的的jsfiddle:http://jsfiddle.net/WJRwv/3/):

var O={ 
    form:{ 
    voting:{ 
     validate: {}, success: {} 
    }, 
    delete:{ 
     validate: {}, success: {} 
    } 
    } 
}; 

O.form=function(formType){ 
    if(formType=='voting'){ 
    return O.form.voting; 
    } 
    else if(formType=='delete'){ 
    return O.form.delete; 
    } 
} 

THE LINE正下方导致错误

O.form.voting.validate=function($form){ //**THIS LINE IS CAUSING THE ERROR** 
    if($form.validate().form()){ // this is a method from the jQuery validate plugin 
    console.log('YES validates'); 
    } 
    else { 
    console.log('NOT valid'); return false; 
    } 
} 

$('input[type=submit]').click(function(){ 
    var formType=$(this).data('form-type'), 
     $form=$(this).closest('form'), 
     formType=O.form(formType); 
     console.log('form type is:'+formType); 
     formType($form); //this should call the O.form.voting.validate method 
}); 

HTML:

<form> 
    <input type="submit" data-form-type='voting' name='voting' value="1"> 
</form> 

<form> 
    <input type="submit" data-form-type='delete' name='delete' value="1"> 
</form> 

回答

1

您的O.form对象文字被O.form函数覆盖。相反...

var O = { 
    form: function(formType) { 
    if(formType=='voting'){ 
     return O.form.voting; 
    } 
     else if(formType=='delete'){ 
     return O.form.delete; 
    } 
    } 
}; 

O.form.voting = { 
    validate: {}, success: {} 
}; 
O.form.delete = { 
    validate: {}, success: {} 
}; 
4

问题是您之前使用函数覆盖了o.form,因此o.form.voting(以及您在其中设置的其他内容)不再存在。

+0

- @ prodigitalson ,谢谢我意识到,但是我在哪里定义'o.form',以便我可以切换使用'o.form.voting'或'o.form.delete'的位置? –

+0

这取决于你希望它的功能,比如你希望以后公开和重写什么,除非你实际编辑代码,你想要“保护”什么? – prodigitalson

1

这是造成问题的原因:

O.form=function 

现在form不再有voting属性。

+0

- @ cammil,谢谢我意识到,但是我在哪里定义了'o.form',以便我可以切换使用'o.form.voting'或'o.form.delete'的位置? –

0

你可以做的反而是创建一个映射表单验证设置的功能,jQuery的验证允许每个形式的验证,并制定出提交表单时要使用的验证......

更新HTML ...

<form data-form-type="voting"> 
    <input type="submit" name="voting" value="1"/> 
</form> 

<form data-form-type="delete"> 
    <input type="submit" name="delete" value="1"/> 
</form> 

更新JS ...

var o = {}; 
o.setFormValidations = function(types) { 
    // Loop through forms and attempt to map each form to an item in the passed 
    // types argument 
    $("form").each(function() { 
     // Get the form type from the data attribute 
     var type = $(this).data("form-type"); 
     // Add in the validator if there is a matching item in the passed 
     // types arguments 
     if(types[type]) { 
      $(this).validate(types[type]); 
     } 
    }); 
}; 

// On document ready we run the function passing in the jQuery validator 
// settings for each form type 
$(function() { 
    namespace.setFormValidations({ 
     "voting" : { 
      rules: {}, 
      messages: {}, 
      submitHandler: function() { 
       // Do something for a valid form 
      } 
     }, 
     "delete" : { 
      rules: {}, 
      messages: {}, 
      submitHandler: function() { 
       // Do something for a valid form 
      } 
     } 
    }); 
});