2017-10-11 4 views
0

現在、検証エラーを表示するために仮想要素を使用しています(パスごとに1つ以上あります)。これによって消費されるエラーメッセージを表示するためのカスタムノックアウトバインド

<div data-bind="foreach: validationErrors"> 
    <!-- ko if: path == 'title' && type == 'validation' --> 
    <div class="field-validation-error text-danger" data-bind="text: message"></div> 
    <!-- /ko --> 
</div> 

例のエラーは、次のとおりです。

{ 
    path: 'title', 
    type: 'validation', 
    message: 'Title is required' 
} 

どのように私は、カスタムバインディングを使用して同じことを達成することができますか?私は、私が何らかの目的のためにやっていることに十分近い、わかりやすい例を見つけることができないようです。

+0

あなたは[コンポーネント](http://knockoutjs.com/documentation/component-overview.html)したいようですね –

+0

私は最終的に私をコンポーネントに導いてくれたテンプレートを含むいくつかの異なるアプローチを試みました。うまくいきませんでした。最後に、フィルタリングされた配列に必要なものを実行するこの実例を見つけました。これは私の[jsfiddle](http://jsfiddle.net/nYbpE/)ではないことに注意してください – nlafratta

答えて

0

シンプルなコンポーネントにそれをラップ:

ko.components.register('errors', { 
 
    viewModel: function(params) { 
 
     this.validationErrors = params.errors; 
 
    }, 
 
    template: 
 
     '<div data-bind="foreach: validationErrors">\ 
 
     <!-- ko if: path == "title" && type == "validation" -->\ 
 
     <div class="field-validation-error text-danger" data-bind="text: message"></div>\ 
 
     <!-- /ko -->\ 
 
     </div>' 
 
}); 
 

 
var model = { 
 
    errorsFromModel: ko.observableArray([ 
 
    {path: 'title', type: 'validation', message: 'Title is required'} 
 
    ]) 
 
}; 
 

 
ko.applyBindings(model); 
 

 
setTimeout(function() { model.errorsFromModel.push({path: 'title', type: 'validation', message: 'Another error added after 1 sec'}) }, 1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 
<errors params="errors: errorsFromModel"></errors>

+0

ありがとうTSV、残念ながらそれは動作しません。 titleという名前のフィールドに対してのみ機能します。すべてのフィールド( 'tit; e'、 'description'など)で作業するには、単一のコンポーネントが必要です。私は、コンポーネントを使用しない別のアプローチを考え出しましたが、私のオリジナルコードよりはあまり冗長ではありません(私はすぐにそれを公開します)。私はまだそれをコンポーネントで一般化する方法を知りたいです。 – nlafratta

+0

@nlafratta: 'path ==" title "' 'ko if:path ==" title "&& type ==" validation "'の条件を取り除かないのはなぜですか?削除すると、すべてのパスで動作します。 – SpiderCode

関連する問題