2

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

我的模型是:

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 有更广泛的内置验证器,我想在这个例子之外使用它们。

我注意到主干形式状态

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

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

有什么方法我仍然可以验证单个字段而无需将验证移动到架构中?

提前致谢。

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

在查看各个字段的表单编辑器源代码时,验证功能如下:

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;
},

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

4

0 回答 0