2017-08-31 3 views
4

J'utilise aurelia-validation, et j'ai créé une customRule.Comment créer une méthode personnalisée pour une customRule donnée dans Aurelia Validation

Règle logique de validation:

export function validateCompare(value: any, obj: any, otherPropertyName: string) { 
    return value === null || 
     value === undefined || 
     value === "" || 
     obj[otherPropertyName] === null || 
     obj[otherPropertyName] === undefined || 
     obj[otherPropertyName] === "" || 
     value === obj[otherPropertyName]; 
} 

Configuration:

import { ValidationRules, validationMessages } from "aurelia-validation"; 
import { validateCompare } from "./compareValidation"; 

export function configureValidation() { 
    validationMessages["required"] = "${$displayName} é obrigatório"; 
    validationMessages["email"] = "${$displayName} em formato inválido"; 

    ValidationRules.customRule("compare", validateCompare, "${$displayName} não confere com ${$getDisplayName($config.otherPropertyName)}", otherPropertyName => ({ otherPropertyName })); 
} 

Utilisation du customRule:

ValidationRules 
    .ensure((m: ClienteEdicaoViewModel) => m.Login).required().satisfiesRule("login") 
    .ensure((m: ClienteEdicaoViewModel) => m.Senha).satisfiesRule("requiredIf", "ConfirmacaoSenha").satisfiesRule("senha") 
    .ensure((m: ClienteEdicaoViewModel) => m.ConfirmacaoSenha).displayName("Confirmação de Senha").satisfiesRule("requiredIf", "Senha").satisfiesRule("compare", "Senha") 
    .on(ClienteEdicaoViewModel); 

Question:

J'utilise tapuscrit, et je voudrais créer une méthode qui enveloppe l'utilisation du satisfiesRule, je voudrais appliquer les règles de cette façon:

ValidationRules 
    .ensure((m: ClienteEdicaoViewModel) => m.Login).required().login() 
    .ensure((m: ClienteEdicaoViewModel) => m.Senha).requiredIf("ConfirmacaoSenha").senha() 
    .ensure((m: ClienteEdicaoViewModel) => m.ConfirmacaoSenha).displayName("Confirmação de Senha").requiredIf("Senha").compare("Senha") 
    .on(ClienteEdicaoViewModel); 

Comment puis-je créer ces requiredIf et compare méthodes et l'utiliser dans le FluentRule?

C# a des méthodes d'extension qu'il serait capable de faire, mais j'ai essayé quelques façons dans la tapuscrit sans succès.

Répondre

4

Vous devez augmenter le module de validation et fournir l'implémentation au prototype. Voici à quoi devrait ressembler votre configuration.

import { ValidationRules, validationMessages, FluentRuleCustomizer, FluentRules } from "aurelia-validation"; 
import { validateCompare } from "./compareValidation"; 

export function configureValidation() { 
    validationMessages["required"] = "${$displayName} é obrigatório"; 
    validationMessages["email"] = "${$displayName} em formato inválido"; 

    ValidationRules.customRule("compare", validateCompare, "${$displayName} não confere com ${$getDisplayName($config.otherPropertyName)}", otherPropertyName => ({ otherPropertyName })); 
} 

declare module "aurelia-validation/dist/commonjs/implementation/validation-rules" { 
    interface FluentRules<TObject, TValue> { 
     compare(value: string): FluentRuleCustomizer<TObject, TValue>; 
    } 

    interface FluentRuleCustomizer<TObject, TValue> { 
     compare(value: string): FluentRuleCustomizer<TObject, TValue>; 
    } 
} 

FluentRules.prototype.compare = function (value: string) { 
    return this.satisfiesRule("compare", value); 
}; 

FluentRuleCustomizer.prototype.compare = function (value: string) { 
    return this.satisfiesRule("compare", value); 
}; 
+1

Et merci pour la question BTW, il a fait mon code mieux aussi :) –

+0

Merci beaucoup, je tentais avec « aurelia-validation » '' déclarer le module, en utilisant l'emplacement complet, il a travaillé, bien fait! !!! –

+0

réponse fantastique –