2016-03-01 2 views
0

J'ai un flux web quelque peu complexe configuré pour permettre la navigation avant et arrière dans le flux. Ce flux web a un objet de support que nous appellerons flowModel.Réaction à un changement de champ d'attribut de modèle dans le flux Web de printemps

Ainsi, les états d'affichage ressemble à quelque chose comme ceci:

<view-state id="beginPage" model="flowModel" view="begin"> 
    // contents 
</view-state> 

<view-state id="multipleChoicePage1" model="flowModel" view="choicePage1"> 
    // contents 
</view-state> 

<view-state id="multipleChoicePage2" model="flowModel" view="choicePage2"> 
    // contents 
</view-state> 

<view-state id="summaryPage" model="flowModel" view="summaryPage"> 
    // contents 
</view-state> 

Le problème se produit lorsque je choisis quelque chose de l'une des pages de choix, vue sur le résumé, puis revenir en arrière dans le flux et faire un autre choix. La page de résumé affichera toujours les valeurs qui ont été calculées à partir du chemin d'origine.

Existe-t-il un moyen, dans le flux Web, de déterminer si une valeur de champ dans le modèle a changé? Si c'est le cas, je peux alors changer manuellement les valeurs "calculées", dans un <on-exit> ou <action-state>. Sinon, ma seule idée consiste à attacher un PropertyChangeListener dans les phases <on-start> ou <on-render> à l'intérieur du <view-state>.

Des idées/suggestions seraient appréciées.

Mise à jour

Je compris que le temps d'une méthode <on-exit> a été touché, les nouvelles valeurs étaient déjà liées au modèle. Donc, je fini par faire ceci:

<view-state id="beginPage"> 
<on-render> 
    <evaluate expression="flowController.enterBeginPage(flowRequestContext)" /> 
</on-render> 
<!-- Transitions --> 
<on-exit> 
    <evaluate expression="flowController.exitBeginPage(flowRequestContext)" /> 
</on-exit> 

A l'intérieur du régulateur de débit, la sur render et sur les méthodes de sortie ressemblait à ceci:

public void onRenderBeginPage(RequestContext requestContext) { 
    MyForm form = requestContext.getFlowScope().get("flowModel",MyForm.class); 
    requestContext.getFlowScope().put("originalFlowModel", form); 
} 

public void onExitBeginPage(RequestContext requestContext) { 
     MyForm form = requestContext.getFlowScope().get("flowModel",MyForm.class); 
    MyForm originalForm = requestContext.getFlowScope().get("originalFlowModel", MyForm.class); 
    requestContext.getFlowScope().remove("originalFlowModel"); 
    if (!form.getOption().equals(originalForm.getOption()) { 
     // do something 
    } 
} 

Il semblait fonctionner assez bien, même si elle était un un peu de kludge.

Répondre

1

hmmm, je suppose que vous pourriez utiliser plusieurs objets flowModel peut-être? Je ne aime pas vraiment, mais peut-être il pourrait travailler

<var name="flowModel" type="FlowModel"/> 
<var name="flowModelChoice1" type="FlowModel"/> 
<var name="flowModelChoice2" type="FlowModel"/> 
<var name="flowModelChoice3" type="FlowModel"/> 

<view-state id="beginPage" model="flowModel" view="begin"> 
    // contents 
</view-state> 

<view-state id="multipleChoicePage1" model="flowModel1" view="choicePage1"> 
    <on-entry> 
     // copy flowModel into flowModel1 
    </on-entry> 
    <transition on="event" to="summaryPage"> 
     // copy flowModel1 into flowModel3 
    </transition> 
</view-state> 

<view-state id="multipleChoicePage2" model="flowModel2" view="choicePage2"> 
    <on-entry> 
     // copy flowModel into flowModel2 
    </on-entry> 
    <transition on="event" to="summaryPage"> 
     // copy flowModel2 into flowModel3 
    </transition> 
</view-state> 

<view-state id="summaryPage" model="flowModel3" view="summaryPage"> 
    // contents 
</view-state> 
+0

Ce qui précède est une version simplifiée de la chose réelle. J'ai tenté de placer un PropertyChangeListener sur l'objet modèle, mais cet écouteur a disparu dès que j'ai atteint un état d'affichage (il l'a fait à travers certaines définitions d'action et d'état de décision). J'ai fini par avoir à implémenter une méthode on-enter pour mettre une copie du modèle dans la portée du flux, et une on-exit pour vérifier ce modèle. – Jason

+0

Je vois. si genre d'une idée similaire, sauf que vous le faites à l'extérieur dans votre contrôleur de flux au lieu du xml – rptmat57

+0

Oui. Une fois tracé dans un diagramme d'état, le flux était trop complexe pour être modélisé dans le XML, de sorte que, pour la plupart, chaque état d'action a une méthode dans un contrôleur de flux. – Jason