2

knockout.jsにバインドされ、検証される動的フォームがありbootstrapValidatorます。

別のコントロールの状態に応じて「必須検証」が必要な入力フィールドが 1 つあります。

入力フィールド:

<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');
    }
}

私が直面している問題は、クラスのメソッドにjavascript 例外があるためremoveField、インスタンスの呼び出しがすべての登録情報を完全に削除していないように見えることです。これは、フィールドを削除したため、実際にはまったく呼び出されるべきではありません。前:bootstrapValidatorupdateStatusbootstrapValidator

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

例外: プロパティ「グループ」の値を取得できません: オブジェクトが null または未定義です

変数fieldには値「inputReason」が含まれています。

だから私の質問はこれです(bootstrapValidatorsのドキュメントはこれremoveFieldについて完全に明確ではないため:フィールドinputReasonの動的に追加された検証を完全に削除するにはどうすればよいですか?

(補足: 誰かがタグ boostrapvalidator を追加できますか?)

4

1 に答える 1

6

OK、掘り下げた後、bootstrapValidator プラグインは、同じプロセスで削除されない入力フィールドに添付されているバリデーターの削除をまだサポートしていないようです。したがって、検証をトリガーする入力フィールドに関連付けられているイベントは登録解除されません。

一時的な回避策は、bootstrapValidator インスタンスを破棄しdata-*、フォームの属性を null に設定して、プラグインを再初期化することです。このコードはbootstrapValidator.removeField()呼び出しを置き換えます。

bootstrapValidator.destroy();

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

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

アップデート

これを行うためのもう 1 つの優れた方法は、bootstrapValidator の有効化/無効化機能を使用することです。

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

(これを指摘してくれた@nghuuphuocに感謝します)

于 2014-09-03T09:37:07.207 に答える