10
votes

Validation Knockout: contraintes dynamiques

J'utilise Durandandal, qui à son tour exploite de knock-out.

Je veux être capable de changez de longueurs de validation de manière dynamique forte> p>

 Entrez la description de l'image ici p>

Fiddle P>

Le violon semble se comporter légèrement différent de ma "solution de travail", mais cela ne fait toujours pas ce que je veux / m'attendre à ce que je veux. P>

ViewModel JS: strong> p>

[tentative 1] strong> p>

   self.userInfo = {       
       IdOrPassportNumber: ko.observable().extend({               
            maxLength: self.maxLength(), 
            minlength: self.maxLength()
       }),
       IdType: ko.observable()
   },

   self.maxLength = ko.observable();

   self.userInfo.IdType.subscribe(function (value) {

          if (value === 'Passport') {
             self.maxLength(15)
          } else {
              self.maxLength(3)
          }
    });


2 commentaires

Pouvez-vous utiliser CDNJS.com pour saisir le plugin de validation Knockout ...


Terminé. +1 ps très cool site. Bookmarked à coup sûr :)


3 Réponses :


6
votes

Voici la solution qui a fonctionné pour moi:

J'ai utilisé le Validation personnalisée < / a> fonctionnalité, plus spécifiquement la Validation personnalisée à usage unique car ce n'est pas réutilisé ailleurs.

[tentative 3] xxx


2 commentaires

Comme une note latérale. J'ai remarqué que l'ordre des validations importe également, de sorte que vous souhaitez que votre validateur personnalisé (ou tout autre) à ce sujet se déclenche en premier, en leur commandant en conséquence.


N'est-il pas préférable d'utiliser deux champs différents avec une validation fixe et de modifier la liaison sur la page ? Enregistrer juste écrire var idorpassword = id () || mot de passe () .



4
votes

considère que ceci xxx

où SouthAfricanidnumber est une validation personnalisée qui utilise regex.


2 commentaires

Bienvenue à :), mais voyez ma réponse acceptée. (Je ne suis plus sur le projet. Mais je vais garder à l'esprit pour l'avenir)


+1 Pour encourager spacerogue avec son premier post.



5
votes

Vous étiez si proche :-) Vous devez fournir l'observable lui-même, pas la valeur non emballée. Donc simplement supprimer le () code> à partir de maxlength () code> - la bibliothèque de validation va automatiquement le déballer pour vous.

    zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    {
        required: true,
        pattern:  ko.pureComputed(function() { 
                     return self.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : ''
                  })
    });


2 commentaires

Pour quelqu'un d'autre lisant ceci. Je suis incapable de tester cela contre cette situation exacte que j'avais à ce stade, (plus sur ce projet). Je préfère la solution de Simon_weaver comme solution acceptée et la marquera comme telle.


Merci. Je dois dire que cela ne m'a eu lieu qu'aujourd'hui que je pourrais être capable de passer un paramètre observable comme un paramètre à une règle, et je me suis très excité - alors réalisa peut-être que cela pourrait peut-être ne pas fonctionner - mais je suis à nouveau excité qu'il semble que cela semble Très bien :-) D'après ce que je me souviens, il n'est pas clairement documenté, mais c'est très facile si vous savez déjà comment utiliser Knockout et ajoute une grande flexibilité.