2011-09-14 14 views
10

W tym artykule Sencha omówiono sposób korzystania z wbudowanych reguł sprawdzania poprawności (obecność, długość, format, włączanie, wykluczanie) i wspomniano, że dodanie niestandardowych reguł jest łatwe, ale nigdy nie wyjaśnia, jak to zrobić. Mam google'ować na wysokim i niskim poziomie i czytać dokumenty sencha, ale nie mogę znaleźć niczego, jak to zrobić. Jakieś pomysły?Jak dodać niestandardową regułę sprawdzania poprawności do modelu w Sencha Touch

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

Odpowiedz

8

Myślę, że to jeden z drobnych błędów w dokumentacji. Mam ich do pracy poprzez dodanie kodu

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"; 
} 

Następnie dodać do modelu walidacji, dodać obiekt do walidacji tablicy modela z typem ustawionym na „zwyczaj”, na przykład

{ 
    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; 
    } 
} 

Aktualizacja: @salgiza rację, istnieje kilka kroków zapomniałem wspomnieć, aby ustawić „to” wyżeł poprawnie. Jeśli spojrzeć w Sencha kodu dotykowym zobaczysz, że na końcu konstruktora Ext.data.Model za to sprawdza czy istnieje funkcja zdefiniowana startowych na obiekcie, a jeśli tak, to nazywa

 if (typeof this.init == 'function') { 
      this.init(); 

Po zdefiniowaniu modelu możesz dodać funkcję init do prototypu. W tej funkcji należy powtórzyć sprawdzanie poprawności obiektu i dodać do niego odwołanie. Ten krok należy wykonać przed utworzeniem któregokolwiek z modeli.

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

Następnie w funkcji niestandardowych walidacji powyżej, po prostu sprawdzić, czy konfiguracja ma wskaźnik siebie, a jeśli tak, to nazywamy go z siebie. Zmieniłem powyższy kod, aby użyć siebie.

Uwaga: nie widzę funkcji init modelu jest udokumentowane, więc jeśli Sencha pozbywa się go, trzeba dodać ten wskaźnik do walidacji tego modelu w jakiś inny sposób.

Przepraszam, jeśli spowodowało to zamieszanie dla kogokolwiek.

+0

ja nie wiem, czy to się zmieniło od kiedy pisał swoją odpowiedź, ale w Sencha 1.1.1 Zakres walidacji jest przedmiotem walidacji, więc nie wydaje się być jakiś sposób, aby uzyskać inne wartości w model, z wyjątkiem sprawdzanego (this.get nie robi nic, ponieważ "to" nie jest modelem). – salgiza

+0

1) Masz za dużo oddziałów "innego". 2) Gdzie jest 'YourModel.prototype.init'? To nie ma sensu. –

+1

@SarahVessels 1. Masz rację. Brakowało mi} dla drugiego bloku. Przepraszam za to. 2. YourModel.prototype.init może przejść w dowolnym miejscu tak długo, jak wykonasz go po ogłoszeniu swojego modelu.Używam RequireJS do zarządzania zależnościami, więc dołączam moduł, który dodaje do prototypu po uwzględnieniu moich modeli. –

2

mam lekko dostosowany kod z Jasonem dla Sencha Touch 2 (od walidacji jest teraz we właściwości konfiguracji modelu). Sugeruję utworzenie klasy bazowej, z której dziedziczą wszystkie inne klasy modeli. Następnie, gdy już to zrobisz, możesz użyć technik Jasona do dodania niestandardowych walidacji w Ext.data.validation singleton.

2

Uważam, że najłatwiejszym sposobem dodania złożonych poprawek niestandardowych do modelu jest nadpisanie metody sprawdzania poprawności. patrz poniżej, ze względu na wywołanie nadrzędne, obsługuje on wbudowane typy sprawdzania poprawności.

validate: function() { 
    var me = this; 
    var errors = this.callParent(arguments); 

    /* custom complex validations here */ 
    if(true !== me.get('checkOne') && 
     true !== me.get('checkTwo') && 
     true !== me.get('checkThree')) { 
     errors.add(Ext.create('Ext.data.Error', { 
        field : 'checkOne', 
        message: 'Choose at least one check, e.g. checkOne' 
       })); 
    } 

    return errors; 
} 
Powiązane problemy