bootstrapValidator:如何动态地向现有输入字段添加和删除验证器?

时间:2014-09-03 08:05:32

标签: javascript jquery knockout.js twitter-bootstrap-3 jqbootstrapvalidation

我有一个动态表单,该表单与knockout.js绑定并由bootstrapValidator验证。

有一个输入字段需要经过验证并且需要进行验证。取决于另一个控制的状态。

输入字段:

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

knockout-viewmodel的相关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');
    }
}

我遇到的问题是,removeField实例bootstrapValidator的调用似乎并未完全删除所有注册信息,因为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;

例外:无法获取属性&#39; group&#39;:对象的值为null或未定义

变量field包含值&quot; inputReason&#39;。

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

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

1 个答案:

答案 0 :(得分:6)

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

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

bootstrapValidator.destroy();

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

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

<强>更新

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

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

(感谢@nghuuphuoc指出这一点)