2012-04-11 2 views
0

J'ai lu et essayé d'utiliser la méthode proposée dans ce fil: How to add a custom validation rule to a model in Sencha Touch.Sencha touch 2.0: validation de modèle personnalisé avec les magasins

Alors d'abord, j'ajouter un type de validation personnalisé au Ext.data.validations singleton:

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

Ensuite, depuis que je suis en utilisant ST2, je demande ce que Ben G propose. J'étend Ext.data.Model pour inclure une référence à 'self' (this).

Ext.define ('MyApp.model.CustomModelBase', { étendent:. '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; 
      } 
     } 
    } 
}); 

Enfin, je crée un modèle extension du CustomModelBase Appelons ce modèle MyApp .model.MyModel. Je définir une règle de validation personnalisée à l'intérieur.

Ext.define('MyApp.model.MyModel', { 
    extend: 'MyApp.model.CustomModelBase', 
    config: { 
     fields: [ {name:'field1'} ], 

     validations: [ 
      { 
       type: 'custom', field: 'field1', message: "Your field is bad", 
       fn: function (value) { 
        **console.log(this);** 
        return (value>0); 
       } 
      }   
     ], 

     proxy: { 
      type: 'localstorage', 
      id : 'MyApp-Local-Storage' 
     }   
    } 
}); 

maintenant, tout fonctionne bien quand une seule instance de MyModel est créé.

Le problème i s quand j'ai le magasin de MyModel. Lorsque vous faites cela, la référence à 'this' reçue dans la fonction fn semble toujours être le dernier élément dans le magasin. Plus précisément, le console.log (this) sort toujours le dernier objet Record du magasin.

Comment puis-je résoudre ce problème?

mise à jour: Je me demande si ce n'est pas parce que tous les enregistrements du magasin partagent la même instance de modèle? Pouvons-nous faire quelque chose à ce sujet ou est-ce que toute la méthode décrite ci-dessus échoue pour utiliser les magasins?

Répondre

Questions connexes