2017-09-24 2 views
0

Sagen wir, ich habe JSF Seite mit gemeinsamen Dropdown-Menü auf der Oberseite (Header) und ein Formular zum Hinzufügen neuer Werte zu diesem Menü. Und ich habe ein absolut korrektes Attribut 'update' des 'ajax'-Tags innerhalb des Formulars (ich meine, das Dropdown-Menü auf der Seite wird nach dem Absenden des Formulars aktualisiert). Der Punkt ist, dass das Dropdown-Menü und das Formular zum Hinzufügen von Werten unterschiedliche Ansichtsklassen haben.Reload Bean Eigenschaft

ersten:

@Named 
@ViewScoped 
public class DropdownMenuView { 

    @Inject 
    private ValuesService service; 

    private List<String> values; 

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

    // Getters Setters... 
} 

Zweiter ein:

@Named 
@ViewScoped 
public class NewValuesView { 

    @Inject 
    private ValuesService service; 

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

Okay, jetzt füge ich neuen Wert über Form und offene Dropdown-Liste. Aber die Liste wird nicht wirklich aktualisiert, da die "Werte" -Liste auf DropDownMenuView immer noch dieselbe ist.

Meine Frage ist, wie 'Werte' nach dem Absenden des Formulars zu aktualisieren? Gibt es einen Weg ohne DropdowneMenuView in NewValuesView zu injizieren und manuell zu aktualisieren?

Die einzige Weise, die ich jetzt sehe, ist, etwas wie "Ereignisklasse" zu implementieren, ein Ereignis nach Wertaktualisierung auszulösen und diese Klasse in Getter zu überprüfen.

Ereignis holer Dummy-Implementierung:

public class EventHolder { 
    private static boolean event; 

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

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

Und Seite 2:

public class NewValuesView { 

    @Inject 
    private ValuesService service; 

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

Und Seite 1:

public class DropdownListView { 

    ... 

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

Aber ich weiß, dass die Put-Logik zu Getter/Setter ist ein schlechter Weg.
Also, irgendwelche Vorschläge?
Danke.

Antwort

0

Vielleicht ist es, weil der Standardbereich der @Inject Anmerkung ist der abhängige Pseudo-scope @Dependent

CDI verfügt über den so genannten abhängigen Pseudo-Scope. Dies ist der Standardbereich für eine Bean, die keinen Geltungstyp explizit deklariert. [...] Eine Instanz einer abhängigen Bean wird niemals zwischen verschiedenen Clients oder unterschiedlichen Injektionspunkten geteilt. Es ist streng ein abhängiges Objekt eines anderen Objekts. Es wird instanziiert, wenn das Objekt, zu dem es gehört, erstellt und zerstört wird, wenn das Objekt, zu dem es gehört, zerstört wird.

Also, wenn Sie Ihren Dienst ValuesService erklären versuchen, einen normalen Umfang zu verwenden (http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#dependentcontext)

Verwandte Themen