penso che sia uno dei piccoli errori nella documentazione. Ho preso a lavorare con l'aggiunta di un po 'di codice
if (Ext.data) {
Ext.data.validations.custom = function (config, value) {
if (config && Ext.isFunction(config.fn)) {
//this should be the model
if (config.self) {
return config.fn.call(config.self, value);
} else {
return config.fn(value);
}
}
else
{
return false;
}
};
Ext.data.validations.customMessage = "Error";
}
Poi aggiungere una convalida a un modello, aggiungere un oggetto alla matrice validazioni del modello con il tipo impostato su 'su misura', ad esempio,
{
type: 'custom', field: 'SomeField', message: "Your field is bad",
fn: function (SomeFieldValueForThisInstance) {
//Add some validation code. The this pointer is set to the model object
//so you can call this.get("SomeOtherFieldToCheck")
//or any other instance method
//if the field is good
return true;
//else
return false;
}
}
Update: @salgiza aveva ragione, ci sono a pochi passi ho dimenticato di dire, al fine di impostare il puntatore 'this' correttamente. Se si guarda il codice contatto Sencha vedrai che alla fine del costruttore di Ext.data.Model controlla per vedere se c'è una funzione di init definita sull'oggetto, e in caso affermativo, lo chiama
if (typeof this.init == 'function') {
this.init();
Dopo aver definito il modello, puoi aggiungere una funzione init al prototipo. Nella funzione, scorrere le convalide per l'oggetto e aggiungere un riferimento a questo. Questo passaggio dovrebbe essere fatto prima che uno qualsiasi dei modelli venga creato.
YourModel.prototype.init = function() {
var i, len;
if (this.validations) {
for (i = 0, len = this.validations.length; i < len; i++) {
this.validations[i].self = this;
}
}
};
Poi nella funzione di validazione personalizzata sopra, basta controllare se la configurazione ha un puntatore sé e se lo fa, lo chiamano con sé. Ho modificato il codice sopra per usare me stesso.
Nota: Non vedo documentata la funzione di init del modello, quindi se sencha si sbarazza di esso, sarà necessario aggiungere il puntatore alle convalide del modello in un altro modo.
Scusa se questo ha causato confusione per nessuno.
Non so se è cambiato da quando hai postato la risposta, ma in Sencha 1.1.1 l'ambito di validazione è l'oggetto di validazione, quindi non sembra esserci alcun modo per ottenere altri valori nel modello, eccetto per quello validato (this.get non fa nulla, poiché "questo" non è il modello). – salgiza
1) Hai troppi rami 'else'. 2) Dove va "YourModel.prototype.init"? Questo non ha senso. –
@SarahVessels 1. Hai ragione. Mi mancava un} per il secondo blocco. Mi dispiace per quello 2. YourModel.prototype.init può andare ovunque fintanto che viene eseguito dopo aver dichiarato il modello.Uso RequireJS per gestire le mie dipendenze, quindi includo il modulo che aggiunge al prototipo dopo aver incluso i miei modelli. –