2013-11-21 206 views
3

jQuery的验证插件(jquery.validate.js)支持方法addClassRules使用()。这让我做这样的事情:jQuery验证插件指定化合物规则验证规则参数

$.validator.addClassRules({ 
    birthdate: { 
    date: true, 
    notFuture: true, 
    notBefore1900: true 
    } 
}); 

其中notFuture和notBefore1900是我以前用的呼叫指定.addMethod()的方法。

这使我可以通过指定类<input class="birthdate" name="foo" />来使用它,它的验证很好,根据触发无效状态的特定方法显示相应的验证错误消息。

我的问题是我怎么做这样的复合规则,并且指定其中作为规则的参数传递给validate()方法的一部分?我希望能够做到这一点:

$('#myForm').validate({ 
    rules: { 
    foo: 'birthdate' 
    } 
}); 

可悲的是,同时验证方法本身可以表示无论是作为类名或明确的规则的参数,像

rules: { 
    foo: 'date' 
} 

一个不能做与类相同规则;它期望的规则参数以验证()是一个方法,而不是一个类的规则。

我可以这样做:

var reusableRule = { 
    date: true, 
    notFuture: true, 
    notBefore1900: true 
}; 
... 
$('#myForm').validate({ 
    rules: { 
    foo: reusableRule 
    } 
}); 

,但我宁愿保持包含插件本身内的事情,而不是入侵全球范围内。我可以做这样的事情

$.validator.customRules = { 
    birthdate: { 
    date: true, 
    ... 
    } 
} 

但随后却看起来很难看(或至少不符合的其他规则项目的语法):

$('#myForm').validate({ 
    rules: { 
    foo: $.validator.customRules.birthdate 
    } 
}); 

另外,我跑的风险后来插件指定像customRules这将导致冲突的版本。

现在,我想我会继续他们在全球范围内,但如果任何人有一个更清洁的方式(或者,如果有一个“正确的方式”,我在解析文档时没有),请分享。谢谢:)

+0

我认为'customRules'的解决方案是最好的选择。我之前在系统中已经看到过这种情况,到目前为止,它在最近的版本更改中运行良好。 – Robb

+0

是啊......我只是讨厌'污染全球命名空间',如果它可以避免。如果插件本身支持某种方法传入一个字符串和一个对象来处理它,它可以很好,它可以在内部检查这些方法以及定义的方法。乐叹。 – jinglesthula

+0

有很多方法可以用这个插件来定义和声明规则......而且你似乎已经尝试了其中的大部分。 – Sparky

回答

1

报价OP:

“?我的问题是我怎么做这样的复合规则,并且指定其中作为规则的参数传递给validate()方法的一部分”

  • .addClassRules()方法创建复合规则,你可以只声明在线为class

  • 如果你想要一个规则,你可以在.validate()内声明,那么你会使用addMethod方法。

  • 或者,可以将复合规则分配给可在.validate()内使用的变量。

否则,我真不明白怎么“入侵全球范围内”是任何一个问题操心。您可以使用所提供的选项,也可以创建自己的选项。我没有看到如何在没有入侵“全球范围”的情况下为任何插件定制任何选项。


报价OP:

“另外,我运行的插件指定如customrules中的东西的一个新版本的风险,这将导致冲突”

我认为这不太可能,而且可能不可能。即使在使用.addMethod()方法使用与现有方法相同的名称创建自定义方法时,也只会使用第二个实例...该实例将是您的自定义规则,因为它是在包含插件方法后定义的。


您还可以结合您的自定义复合规则到新的套使用jQuery extend() method复合规则。

下面是一些参考:https://stackoverflow.com/a/9056425/594235

+0

是的,我只是希望能够结合和重用现有的规则与他们各自的消息,并通过在.validate()参数中指定单个字符串/键来获得addClassRules的行为,而不是将对象传递给.validate( )直接。我希望有一个'addArgumentsRules'或者'addClassRules'让你使用.validate()中的'class'作为字符串以及元素的class属性。噢 - 也许在插件的更高版本:) – jinglesthula

+0

至于碰撞,我的意思是,如果插件的更高版本在$ .validator上指定了某些与我决定作为容器固定的名称相同的名称对于我自定义的规则定义对象,如果我升级它会发生碰撞。我不会添加自定义方法,而是直接使用$ .validator的成员。 – jinglesthula

+0

@jinglesthula,我认为这是一个有争议的问题,因为在我的'addMethod'示例中,您的代码优先。但是你可以使用非常独特的命名,这是不太可能被开发者复制的。 – Sparky