2016-06-03 1 views
0

Je souhaite valider les dépendances de champs avec un autre champ lorsque le champ actuel a changé.Eclipse Scout Neon sur la boucle de détection de validation de jeu de valeurs

idée de base est que si j'ai champ A et les champs B,C,D,E,... et il y a un graphe de dépendances complexes sur ces domaines, je voudrais avoir à résoudre comme ceci:

  • Quand je mis la valeur Un formulaire d'exportation données (état actuel de la forme)
  • données de formulaire
  • est envoyé en éclaireur serveur
  • sur le graphique des dépendances de serveur scout est calculé et résolu (nous obtenons la liste dans l'ordre)
  • appel setters des champs dans l ordre ist qui "fixe" les données de formulaire
  • Les données de formulaire d'importation à la fin.

Mon problème est que si je déclenche cet événement dans

@Override 
protected void execChangedValue() { 
    // trigger export 
    // trigger server validation 
    // trigger import 
} 

Je reçois

2016-06-03 13:31:28,468 WARN scout-model-thread-22 o.e.s.rt.client.ui.form.fields.AbstractValueField - Loop detection in ...$FieldA with value 101191 [m4042 @ ] 
java.lang.Exception: null 

Comment résoudre ce problème?

J'ai même un problème si, en cas d'erreur, je veux abandonner l'importation et rétablir l'ancienne valeur.

@Override 
protected void execChangedValue() { 
    // trigger export 
    // trigger server validation 
    if (error) { 
     setValueWithoutTrigger(oldValue) 
    } else { 
     // trigger import 
    } 
} 

Qu'est-ce que oldValue peu importe, il pourrait être nulle. (donc réinitialiser la valeur en cas d'erreur). Méthode setValueWithoutTrigger est le même que setValue() mais avant valeur réglée, il a appelé this.setValueChangeTriggerEnabled(false);

Je sais que cela pourrait être fait en quelque sorte, parce que je voyais des fonctionnalités similaires dans le code BSI.

+0

Je ne Je comprends. Autant que je comprends, vous voulez calculer les valeurs des champs B, C, D et E sur le serveur. Pourquoi auriez-vous besoin de définir des méthodes execChangedValue() sur le client? –

+0

Je ne comprends pas votre commentaire. Qu'est-ce qui déclencherait alors la vérification côté serveur sinon execChangedValue()? Si je veux déclencher la validation sur le serveur lorsque l'utilisateur change certaines données dans le champ A, il doit être déclenché à partir du client, et execChangedValue me semble être un bon endroit. –

+0

Vous avez raison. Maintenant, je comprends votre question. Je vous remercie. –

Répondre

0

Il n'est pas possible de définir la valeur d'un champ dans la méthode execChangedValue du même champ. Le cadre détecte une boucle ici.

Qu'est-ce que vous pourriez faire à la place est d'utiliser la méthode execValidateValue comme suit

@Override 
protected String execValidateValue(String rawValue) throws ProcessingException { 
    MyFormData formData = new MyFormData(); 
    exportFormData(formData); 
    formData = sendFormDataToServerAndDoValidation(); 
    importBCDE(formData); 
    return formData.getTest().getValue(); 
    } 

La méthode importBCDE fixerait champs B, C, D et E, mais pas de champ A.

+0

Ok, mais pourquoi détecter une boucle? (Je veux dire, je vois le code et je sais pourquoi, mais ...) Il n'y a en fait pas de boucle. Comme import est appelé sans déclencheur, execValidateValue ne sera pas appelé à nouveau. Y at-il un moyen de dire, ignorer la détection de boucle parce que je sais qu'il n'y aura pas de boucle? –

+0

Il existe une méthode appelée 'setValueChangeTriggerEnabled (boolean b)'. Cependant, cela ne fonctionne pas lorsqu'un champ définit sa propre valeur. –