2011-08-12 1 views
8

Avertissement: Je travaille avec un backend sur lequel je n'ai pas de contrôle total, donc je me bats avec quelques considérations dans Backbone qui pourrait être mieux adressé ailleurs ... malheureusement, je n'ai pas d'autre choix que de les manipuler ici! Donc, mon problème est que je voudrais vraiment valider l'entrée de l'utilisateur depuis un formulaire (quand je mets des valeurs avec lui sur les modèles Backbone), mais les modèles que je reçois de l'API sur les objets nouvellement créés (via les messages UNIQUEMENT accepter un nom, et retourner seulement un nom et un identifiant d'objet) échouera mes contrôles de validation. Par exemple, lorsqu'un nouvel objet est créé dans la base de données, deux champs clés sont remplis comme des chaînes vides (et lorsque Backbone rencontre l'API et remplit les modèles, il remplit ces clés avec des chaînes vides). Quand l'utilisateur enregistre ces objets, post-édition, je voudrais les forcer à entrer des valeurs pour ces deux clés - ce qui est très facile, étant donné la méthode de validation intégrée de Backbone. Le problème, bien sûr, est que la validation se déclenche à la fois sur fetch-> set (comportement indésirable) et set-> save (comportement souhaité) - et donc les modèles nouvellement créés ne se chargeront pas du tout. .Backbone les recueille, la validation échoue et les erreurs se déclenchent. Donc, ma question est: existe-t-il un moyen de "Backbone-y" pour valider uniquement les modèles sur set-> save, pas sur fetch-> set? Pourrais-je utiliser un déclencheur spécifique pour contourner ce problème?Validation du modèle Backbone.js uniquement sur set-> save (pas sur fetch)

Toutes les idées seraient grandement appréciées.

Répondre

7

Backbone.Model.set ne sera pas effectuer la validation si vous passez { silent: true }, et fetch passera toutes les options par le biais de définir, de sorte que vous pouvez soit passer outre fetch ou écrire votre propre méthode fetchSilent qui passe que dans un objet d'options.

Cependant, vous risquez de rencontrer un léger problème avec Backbone.Collection.fetch, car lorsqu'il reçoit des attributs du serveur, il ne crée pas les nouveaux modèles avec set. Au lieu de cela, il crée un nouveau modèle avec model = new this.model(attrs, {collection: this});, puis effectue une validation s'il existe une méthode validate sur l'objet.

C'est un peu ennuyeux. Vous pouvez le contourner en définissant une méthode parse sur votre collection (si vous en utilisez un) qui crée un modèle en mode silencieux (en utilisant {silent: true}), car lorsque Backbone.Collection.add reçoit un modèle Backbone entièrement formé, il ne lance pas la validation. (voir les méthodes _add et _prepareModel dans le annotated source).

C'est un peu ennuyeux que la collection fonctionne de cette façon, mais (pour l'instant au moins) c'est ce que c'est.

+0

Ennuyeux en effet, mais merci pour les conseils - très appréciés. – ltd

+0

Pour autant que je peux voir, dans le dernier code source backbone DOES valider lors de la configuration même lorsque le silence est passé, ce qui ne va pas aider –

4

Au lieu de passer outre vous pouvez faire d'extraction une autre chose:

Lorsque vous validez votre modèle, vérifiez model.silent et ne valide si cela n'existe pas.

Vous effectuez les opérations suivantes lorsque vous voulez chercher un modèle:

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function 
validate: function(attrs) { 
    if (!attrs.silent) { 
    // validate logic here 
    } 
} 

Ensuite, vous pouvez chercher le modèle. Après avoir obtenu votre modèle, vous pouvez désactiver silencieux, pour une validation future.

Questions connexes