2017-09-24 3 views
0

Disons que, j'ai la page JSF avec menu déroulant commune sur le dessus (en-tête) et un formulaire d'ajout de nouvelles valeurs à ce menu. Et j'ai une étiquette absolument correcte attribut « mise à jour » de « ajax » intérieur de la forme (je veux dire, ce menu déroulant de la page est mis à jour après la présentation du formulaire). Le point est que le menu déroulant et le formulaire pour ajouter des valeurs ont différentes classes de vue.propriété de haricots

premier:

@Named 
@ViewScoped 
public class DropdownMenuView { 

    @Inject 
    private ValuesService service; 

    private List<String> values; 

    @PostConstruct 
    public void init() { 
     value = service.getValues(); 
    } 

    // Getters Setters... 
} 

seconde:

@Named 
@ViewScoped 
public class NewValuesView { 

    @Inject 
    private ValuesService service; 

    public void addValue(String newValue) { 
     service.addValue(newValue); 
    } 
} 

Ok, maintenant j'ajouter une nouvelle valeur via le formulaire et la liste déroulante ouverte. Mais la liste n'est pas vraiment mise à jour car la liste 'values' sur DropdownMenuView est toujours la même.

Ma question est, comment mettre à jour les «valeurs» après la soumission du formulaire? Est-il possible sans injecter DropdowneMenuView à NewValuesView et la mise à jour manuellement? La seule façon dont je vois maintenant est d'implémenter quelque chose comme "events class", de déclencher un événement après la mise à jour de la valeur et de vérifier cette classe dans getter.

Event holer mise en œuvre factice:

public class EventHolder { 
    private static boolean event; 

    public static void fire() { 
     event = true; 
    } 

    public static boolean poll() { 
     boolean res = event; 
     event = false; 
     return res; 
    } 
} 

Et page 2:

public class NewValuesView { 

    @Inject 
    private ValuesService service; 

    public void addValue(String newValue) { 
     service.addValue(newValue); 
     EventHolder.fire(); 
    } 
} 

Et page 1:

public class DropdownListView { 

    ... 

    public List<String> getValues() { 
     if (EventHolder.poll()) { 
      values = service.getValues(); 
     } 
     return values; 
    } 
} 

Mais je sais que la logique de mettre à getters/setters est un mauvaise façon.
Alors, des suggestions?
Merci.

Répondre

0

Peut-être, il est parce que la portée par défaut du @Inject annotation est le pseudo-champ dépendant @Dependent

CDI dispose la soi-disant pseudo-portée dépendante. C'est la portée par défaut pour un bean qui ne déclare pas explicitement un type de portée. [...] Une instance d'un bean dépendant n'est jamais partagée entre différents clients ou différents points d'injection. C'est strictement un objet dépendant d'un autre objet. Il est instancié lorsque l'objet auquel il appartient est créé et détruit lorsque l'objet auquel il appartient est détruit.

Ainsi, lorsque vous déclarez votre service ValuesService essayez d'utiliser un champ normal (http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#dependentcontext)