2012-10-30 63 views
3

我使用骨干表格和已经创建了以下架构模型:实时验证骨干窗体

schema: 
    title: 
     type: "Text" 
     validators: ["required"] 
    description: 
     type: "TextArea" 
     validators: ["required"] 
    location: 
     type: "Text" 
     validators: ["required"] 

当我尝试,并提交与空字段的形式,验证正确地发生他们都收到错误类。

但是,当我更新输入以获取内容时,直到我尝试再次提交表单时,才从我的输入中删除错误类。 同样,如果我最初输入一个有效的输入,然后删除所有内容,它不会通知我一个错误,直到我再次尝试提交表单,而我想立即知道。

有没有办法在修改过的输入字段上触发验证?

+0

彼得汉密尔顿,你有没有想过如何一次只验证一个领域? –

+0

我不记得发生了什么事,但我觉得很遗憾我没有......抱歉! –

回答

0

从文档:http://backbonejs.org/#Model-validate:如果您对其进行更改默默

isValidmodel.isValid()

的模型可能进入无效状态......用表单输入打交道时非常有用。根据您的验证功能,致电model.isValid()检查模型当前是否处于有效状态。

https://github.com/thedersen/backbone.validation#what-gets-validated-when

什么时候得到验证?

如果您使用Backbone v0.9.1或更高版本,将验证模型中的所有属性。但是,如果名称从未被设置(显式或默认值),该属性在被设置之前不会被验证。

当填充表单时验证表单非常有用,因为您不希望提醒用户输入中尚未输入的错误。

如果您需要验证整个模型(这两个属性都已设置或没有设置),您可以在模型上调用validate()isValid(true)

的骨架表格文档特别提到model.validate:

https://github.com/powmedia/backbone-forms#model-validation

你可以很容易钩model.Validate高达任何编辑的事件或单击你想要的事件。

此外,你可能会发现这个有用的(不知道这是否是兼容Backbone.Forms虽然):

https://github.com/thedersen/backbone.validation

+0

我真的希望它只在一个字段上执行验证。我知道当价值改变时我可以验证表单,但如果我改变了输入A,输入B和C也得到验证,并显示错误,这不是一个非常好的用户体验。 –

+0

你不需要backbone.validation,Backbone-forms有一个内置的验证器... – inf3rno

0

你可以做的办法“实时验证”与骨干,形式是通过扩展Backbone.Form模型并附加事件以调用您的自定义方法来验证该字段,然后只需“新建”自定义窗体而不是Backbone.Form

(Backbone.Form is just Backbone的一个子类。查看)

下面是一些示例代码:

var MyCustomForm = Backbone.Form.extend({ 
     events: { 
      "blur input": "validateRealTime" 
     }, 
     validateRealTime: function(e){ 
      if(e.currentTarget.value == "") return; 
      var err = this.fields[e.currentTarget.name].validate(); 
      if(err) 
       myDisplayErrorMethod(err.message); 
     } 
    }); 

关于这个伟大的事情是,它会利用你在模型架构中定义的验证,所以你得到所有你在那里的定义相同的验证和消息好(如果你确实定义了自定义颜色)。

另外,如果您像我一样定义了几个验证器,每次用户从字段中“模糊”,它都会按顺序调用验证器,直到所有验证器都通过为止。所以这是一个加号。

附注,你会注意到我做了if(e.currentTarget.value == "") return;。这只是我的用例,我不想仅仅因为用户点击并点击而显示错误。