2

我有一个动态表单,它绑定knockout.js并由bootstrapValidator.

有一个输入字段需要根据另一个控件的状态进行“必需验证”。

输入字段:

<textarea id="inputReason" name="inputReason" rows="3" 
          class="form-control col-lg-8"
          data-bind="value: Reason" />

淘汰视图模型的相关 javascript 部分:

self.SelectAbsenceType = function (absenceType) {
    self.SelectedID(absenceType.ID);

    if (self.SelectedAbsenceType().ReasonRequired) {
        $('#formCreate').bootstrapValidator('addField', 'inputReason', {
            validators: {
                notEmpty: {
                    message: 'Please enter a reason'
                }
            }
        });
    } else {
        $('#formCreate').bootstrapValidator('removeField', 'inputReason');
    }
}

我面临的问题是removeFieldbootstrapValidator实例的调用似乎并没有完全删除所有注册信息,因为类的updateStatus方法中有一个javascript异常bootstrapValidator,实际上根本不应该调用该异常,因为我已经删除了该字段前:

var that  = this,
    type  = fields.attr('type'),
    group = this.options.fields[field].group || this.options.group,
    total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;

异常:无法获取属性“组”的值:对象为空或未定义

该变量field包含值“inputReason”。

所以我的问题是这样的(因为 bootstrapValidators 的文档removeField对此并不完全清楚:如何删除字段 inputReason completey 的动态添加验证?

(旁注:有人可以添加标签 boostrapvalidator 吗?)

4

1 回答 1

6

好的,经过一番挖掘,似乎 bootstrapValidator 插件根本不支持删除附加到输入字段的验证器,这些输入字段不会在同一进程中删除。因此,附加到触发验证的输入字段的事件不会被取消注册。

一个临时的解决方法是销毁 bootstrapValidator 实例,将data-*表单的属性设置为 null 并重新初始化插件。此代码替换bootstrapValidator.removeField()调用:

bootstrapValidator.destroy();

$('#formCreate').data('bootstrapValidator', null);

$('#formCreate').bootstrapValidator();

更新

另一种更好的方法是使用 bootstrapValidator 的启用/禁用功能:

bootstrapValidator
    .enableFieldValidators
     (
        'inputReason', 
        self.SelectedAbsenceType().ReasonRequired
     );

(感谢@nghuuphuoc 指出这一点)

于 2014-09-03T09:37:07.207 回答