2013-08-23 8 views
29

Twitterで検証クラスをブートストラップします。 has-errorまたはhas-warningは、入力要素とそのラベルをスタイルするために、ラップform-group要素に配置する必要があります。しかしKnockout-Validationはクラスを入力要素に追加します。ブートストラップ・ツイッター3.0とknockoutjs検証

<div class="form-group has-error"> 
    <label class="control-label">Input with error</label> 
    <input type="text" class="form-control"> 
</div> 

それはdivなくinputにクラスを追加する方法でノックアウト・検証を設定することは可能ですか?

+2

英語を明確にすることはできますか?特に、この文は意味をなさない:「ブートストラップは入力要素の代わりにdivを変更したい」 divを変更したいですか?何のdiv?そしてどのように?これは入力要素と何が関係していますか? –

答えて

56

thebringkingさんの回答はあなたをそこに逃がすことはありません。 errorMessageClassdecorateInputElementオプションも指定する必要があります。

ko.validation.init({ 
 
    errorElementClass: 'has-error', 
 
    errorMessageClass: 'help-block', 
 
    decorateInputElement: true 
 
}); 
 

 
var viewModel = ko.validatedObservable({ 
 
    name: ko.observable().extend({ 
 
    required: true 
 
    }), 
 
    email: ko.observable().extend({ 
 
    required: true, 
 
    email: true 
 
    }), 
 
    submit: function() { 
 

 
    if (!this.isValid()) { 
 
     this.errors.showAllMessages(); 
 
    } else { 
 
     alert('good job'); 
 
    } 
 
    } 
 
}); 
 

 
ko.applyBindings(viewModel);
<link href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.2/css/bootstrap.min.css" rel="stylesheet" /> 
 

 

 
<div class="container"> 
 
    <form class="form-horizontal"> 
 
    <div class="form-group" data-bind="validationElement: name"> 
 
     <label class="control-label col-xs-2" for="name">Name</label> 
 
     <div class="col-xs-10"> 
 
     <input id="name" class="form-control" type="text" data-bind="textInput: name" /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group" data-bind="validationElement: email"> 
 
     <label class="control-label col-xs-2" for="email">Email</label> 
 
     <div class="col-xs-10"> 
 
     <input id="email" class="form-control" type="text" data-bind="textInput: email" /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group"> 
 
     <div class="col-xs-offset-2 col-xs-10"> 
 
     <button type="submit" class="btn btn-primary" data-bind="click: submit">Submit</button> 
 
     </div> 
 
    </div> 
 
    </form> 
 
</div> 
 

 

 
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> 
 
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.min.js"></script>

+4

このオプションは現在、decorateInputElementと呼ばれています。 https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Configurationを参照してください –

+0

@RichardCollette更新 –

+0

ありがとう!同様のことを試みている人は、init関数をビューモデルの外で実行する必要があります。バインドを開始する前に –

2

あなたは、ブートストラップ、フォーム上の「validationElement」結合ハンドラを使用するには、

<div class="form-group" data-bind="validationElement: someObservable"> 
    <label class="control-label" for="inputSuccess">Input with success</label> 
    <input type="text" class="form-control" id="inputSuccess"> 
</div> 

は、その後、あなたが「持っているエラー」のブートストラップエラークラスを使用するためにノックアウトの検証プラグインのconfigurationを設定しますdiv-。

ko.validation.init({errorElementClass:'has-error'}) 

これは私がツールで行う方法です。

5

あなたはこのようにノックアウト検証コアを拡張することができます:

var init = ko.bindingHandlers['validationCore'].init; 
ko.bindingHandlers['validationCore'].init = function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
    init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext); 
    var config = ko.validation.utils.getConfigOptions(element); 
    // if requested, add binding to decorate element 
    if (config.decorateInputElement && ko.validation.utils.isValidatable(valueAccessor())) { 
     var parent = $(element).parents(".form-group"); 
     if (parent.length) { 
      ko.applyBindingsToNode(parent[0], { validationElement: valueAccessor() }); 
     } 
    } 
}; 

このコードは、親フォーム・グループは入力と同じクラスで飾られます。

+0

おかげで、 'config.decorateElement'を' config.decorateInputElement'に変更して現在のバージョンと一致させるだけです。 –

+0

@MikaTähtinenは –

+0

を更新しました。これは本当にすっきりした解決策です。また、他の人が遭遇する可能性のある問題の原因にもつながりました。(カスタムデザインバインディングを使用してMaterial Design Lite用) value/textInputバインディングも持っていました。検証initが起動する前にラッパー要素を追加する必要があるため、順序は重要です。value/textInputバインディングがラッパー要素を追加するカスタムバインディングの後にあることを確認してください。 – fubaar

関連する問題