2012-07-05 227 views
4

我有一个插件,通常处理用于CRUD操作的jQuery对话框的创建。添加到对话框中的表单的标记在插件代码的外部可用,插件只需要向http服务提供标记,并在收到时简单地将其添加到对话框本身。动态添加验证规则

然后,我在插件(onSetupValidation函数)中创建了一个回调函数,它是插件用户为每个表单定制验证的句柄。这是我使用的代码示例

var element = $('#mydiv'); 
element.crudplugin({ 
    [...] 
    onSetupValidation: function(markup) { 
     var form = $('#myForm', markup); 
     var container = $('<div class="error"><p>Errors were found validating your form. Please correct them and retry.</p><ol></ol></div>') 
         .appendTo(form).hide(); 
     var validator = form.validate({ 
      errorContainer: container, 
      errorLabelContainer: $('ol', container), 
      errorElement: 'em', 
      wrapper: 'li', 
      highlight: function (element) { 
       $(element).addClass("ui-state-error"); 
      }, 
      unhighlight: function (element) { 
       $(element).removeClass("ui-state-error"); 
      }, 
      submitHandler: function (form) { 
       [...] 
      } 
     }); 
    } 
    [...] 
}); 

好吧。让我们来看看问题

  1. 如果我在标记内添加验证规则(作为类属性),验证根本不起作用。同样的行为,如果我在validate()方法
  2. 周围的Googling添加规则我发现有很多的样品,expecially这里是这样,使用validation plugin喜欢的.rules('add', rule)方法下面的示例中,所有这些链接建议致电validate下面的示例中添加任何规则,像以前一样的方法

    $("#myField", markup).rules("add", { required: true }); 
    

但是,如果使用时istruction得到执行我收到以下错误此方法:

SCRIPT5007: Unable to get value of the property 'settings': object is null or undefined jquery.validate.min.js, line 15 character 257

有什么建议吗?

回答

4

你绝对是在正确的轨道上。

关键是您必须在窗体中向单个字段添加规则之前,在窗体上调用validate

如果您想查看触发此案例的示例,则可以检出my answer to a previous question(或特别是jsfiddle)。在那个jsfiddle中,如果你注释掉最后4行的javascript($('#myForm').validate({/* ... */});),它会触发你看到的同样的错误信息。

从您的问题中也不清楚,但您可能在窗体可见之前调用validate?如果是这样,那么很可能是没有帮助...

+0

感谢您的回答。在创建对话框和表单显示之前调用回调。在回调中,我先调用validate()然后添加规则。我将尝试在show()方法后移动回调... – Lorenzo 2012-07-05 22:42:36

+0

这样做肯定会 - 如果这是一个jQuery对话框,“open”事件将是一个合适的地方。 – Ryley 2012-07-05 22:47:28

0

只需添加。如果你不介意使用丑陋的代码,你可以做这样的事情

var your_new_object = $("#theForm").validate().settings; 
your_new_object ... //do some stuff with it 
$("#theForm").validate().setting = your_new_object; 

凡your_new_object是原始设置的更新版本对象

正如我所说的,是一个丑陋的做法,但如果没有别的作品,试试看