2017-10-11 6 views
0

Ich verwende derzeit virtuelle Elemente, um Validierungsfehler anzuzeigen (es kann mehr als 1 pro Pfad geben).Benutzerdefinierte Knockout-Bindung zur Anzeige von Fehlermeldungen

<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> 

Ein Beispiel Fehler, der durch diese verbraucht wird, ist:

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

Wie kann ich das Gleiche erreichen mit einer benutzerdefinierten Bindung? Ich kann kein verständliches Beispiel finden, das nah genug an meinem Nutzen liegt.

+0

Es klingt wie Sie eine [Komponente] (http://knockoutjs.com/documentation/component-overview.html) –

+0

wollen Ich habe ein paar verschiedene Ansätze einschließlich Templates ausprobiert, die mich letztendlich zu einer Komponente geführt hätten. Keines hat gut funktioniert. Am Ende habe ich dieses Arbeitsbeispiel gefunden, das in einem gefilterten Array das tut, was ich brauche. Beachten Sie, das ist nicht mein [jsfiddle] (http://jsfiddle.net/nYbpE/) – nlafratta

Antwort

0

Einfach wickelte es auf die Komponente:

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

Danke TSV, aber das wird leider nicht funktionieren. Es funktioniert nur für Felder mit dem Titel. Ich brauche eine einzige Komponente für alle Felder ('tit; e', 'description' usw.). Ich habe einen alternativen Ansatz gefunden, der keine Komponente verwendet, aber er ist nicht viel weniger ausführlich als mein ursprünglicher Code (ich werde ihn bald veröffentlichen). Ich würde immer noch gerne wissen, wie man es mit einer Komponente verallgemeinern kann. – nlafratta

+0

@nlafratta: Warum entfernen Sie nicht die Bedingung für 'path ==" title "' aus 'ko if: path ==" title "&& type ==" validation "'. Nach dem Entfernen funktioniert das für alle Pfade. – SpiderCode

Verwandte Themen