2011-09-14 10 views
10

Questo articolo di Sencha spiega come utilizzare le regole di convalida incorporate (presenza, lunghezza, formato, inclusione, esclusione) e menziona che aggiungere regole personalizzate è facile, ma non spiega mai come farlo. Ho cercato su google in alto e in basso e ho letto i documenti sencha, ma non riesco a trovare nulla su come farlo. Qualche idea?Come aggiungere una regola di convalida personalizzata a un modello in Sencha Touch

http://www.sencha.com/learn/using-validations-and-associations-in-sencha-touch

risposta

8

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.

+0

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

+0

1) Hai troppi rami 'else'. 2) Dove va "YourModel.prototype.init"? Questo non ha senso. –

+1

@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. –

2

ho un po 'adattato il codice da Jason per Sencha Touch 2 (dal convalide è ora nella proprietà di configurazione del modello). Suggerisco di creare una classe base da cui erediterebbero tutte le altre classi del modello. Quindi, una volta fatto ciò, è possibile utilizzare le tecniche di jason per aggiungere convalide personalizzate nel singleton Ext.data.validations.

Ext.define('MyApp.model.CustomModelBase', { 
    extend: 'Ext.data.Model', 

    //adding an initializer to let custom validators access "self" 
    init : function() { 
     var i, len; 
     if (this.config.validations) { 
      for (i = 0, len = this.config.validations.length; i < len; i++) { 
       this.config.validations[i].self = this; 
      } 
     } 
    } 
}); 
2

Penso che il modo più semplice per aggiungere convalide personalizzate complesse al modello sia sovrascrivere il metodo di convalida. vedi sotto, a causa della chiamata genitore, supporta i tipi di convalida incorporati.