验证主干表单的单个字段

时间:2013-01-02 15:47:39

标签: validation backbone.js coffeescript backbone-forms

我希望能够使用backbone formsbackbone validation在我的表单中一次验证单个字段,但是如果我将我的要求放入模型验证中,我就会遇到问题而不是架构。

我的模特是:

class Event extends Backbone.Model
  url: ->
    '/events' + (if @isNew() then '' else '/' + @id)

  validation:
    title:
      required: true
    start_date:
      required: true
    end_date:
      required: true

  schema: ->
    title:
      type: "Text"
    start_date:
      type: "DateTime"
      title: "Start Date"
      DateEditor: "DatePicker"
    end_date:
      type: "DateTime"
      title: "End Date"
      DateEditor: "DatePicker"

我的视图中使用这些代码的代码是

class Events extends Backbone.View
  ...
  initialize: ->
    @form = new Backbone.Form(model: @model).render()
    Backbone.Validation.bind @form;

  validateField: (field) ->
    @form.on "#{field}:change", (form, fieldEditor) =>
      @form.fields[field].validate()

  render: ->
    ...
    @validateField for field of @form.fields
    ...

然而,我的问题是它似乎只是验证我是否将required: true移动到架构中,如下所示:

schema: ->
  title:
    type: "Text"
    validators: ["required"]

但是我不想这样做,因为backbone.validation有更广泛的内置验证器,我想在这个例子之外使用它。

我注意到骨干式状态

  

有两个级别的验证:模式验证器和常规内置的Backbone模型验证。当调用form.commit()或form.validate()时,Backbone Forms将同时运行。

但是,当我验证各个字段时,我不确定它是否正在运行常规验证?想要这样做的原因是,当用户开始创建事件时,我不想验证他们尚未填写的字段。

有什么办法可以在不必将验证移到架构中的情况下验证单个字段吗?

提前致谢。

======= 更新 =======

在查看各个字段的form editors source code时,验证功能如下:

validate: function() {
  var $el = this.$el,
      error = null,
      value = this.getValue(),
      formValues = this.form ? this.form.getValue() : {},
      validators = this.validators,
      getValidator = Form.helpers.getValidator;

  if (validators) {
    //Run through validators until an error is found
    _.every(validators, function(validator) {
      error = getValidator(validator)(value, formValues);

      return error ? false : true;
    });
  }

  return error;
},

它似乎没有使用模型验证,所以我想知道如何将其合并?

0 个答案:

没有答案