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.