2014-04-24 12 views
5

Attualmente sto creando un app con numero elevato in Knockout. Nella mia app ci sono tre tipi di numeri: percentuali, decimali e numeri grandi e ho gestori di binding personalizzati per ogni tipo.Knockout condivide un gestore di binding

Per gli input ho anche creato un numero di convalida bindingHandler che legge ogni pressione di un tasto per garantire che si tratti di un numero inserito. (nell'app ci sono animazioni e animazioni CSS con bordi appariscenti - questo è solo un esempio di nudo spoglio).

Ora che gli input eseguono i controlli di convalida e la formattazione del numero, ho dovuto legare la variabile due volte, come vedrete correttamente nel violino qui sotto.

<input data-bind="number: testdata, percentage: testdata"> 

Sto pensando che questo sia inutilmente gonfiore mia markup HTML e non ci deve essere un modo più ordinato per attivare entrambi i gestori, allo stesso tempo.

La mia domanda: È possibile creare lo script di convalida del numero come una funzione che può quindi essere condivisa/inclusa all'interno dei gestori di formattazione dei numeri; senza gonfiare il mio Javascript?

Sono ancora relativamente un principiante in Knockout, quindi sono ancora incerto sui suoi limiti.

See Fiddle: http://jsfiddle.net/axV6S/1/

risposta

2

Sì, si può semplicemente estrarre il numero init nella sua propria funzione, vale a dire cambiare questo:

ko.bindingHandlers.number = { 
    init: function (element) { 
     /* ... */ 
    } 
}; 

in questo:

var numberInit = function(element) { 
    /* ... */ 
}; 

basta chiamare dal tuo altro init in questo modo:

init: function(element, valueAccessor) { 
    numberInit(element); 
    /* ... */ 
} 

o se si desidera mantenere la destra 'questo' contesto:

init: function(element, valueAccessor) { 
    numberInit.apply(this,arguments); 
    /* ... */ 
} 
0

si duplica un sacco di costruito in funzionalità all'interno eliminazione diretta. Durante la creazione del tuo modello di vista è possibile definire restrizioni per le proprietà del modello. Si può fare questo per un sacco di dati numerici:

this.FieldName = ko.observable().extend({ pattern: regex }); 

Questo sarà limitare i vostri campi di testo, un ND non è necessario per l'ascolto di tasti premuti, e prendere provvedimenti. Knockout fa questo sullo sfondo per te!

Date un'occhiata a questo per ulteriori esempi: http://mikedormitorio.azurewebsites.net/BlogPost/the-native-validation-rules-of-knockout-validation

Questa è anche una lettura utile: http://knockoutjs.com/documentation/extenders.html

+1

Si prega di notare che questa si basa su [Knockout-Validation] (https://github.com/Knockout -Contrib/Knockout-Validation), che è una libreria esterna e non parte di Knockout Core. – janfoeh

Problemi correlati