【发布时间】:2018-03-05 12:09:15
【问题描述】:
假设,我有一个 JSF 页面,顶部有一个通用下拉菜单(标题)和一个用于向该菜单添加新值的表单。而且我在表单内有一个绝对正确的“ajax”标签属性“更新”(我的意思是,页面上的下拉菜单在提交表单后更新)。关键是用于添加值的下拉菜单和表单具有不同的视图类。
第一个:
@Named
@ViewScoped
public class DropdownMenuView {
@Inject
private ValuesService service;
private List<String> values;
@PostConstruct
public void init() {
value = service.getValues();
}
// Getters Setters...
}
第二个:
@Named
@ViewScoped
public class NewValuesView {
@Inject
private ValuesService service;
public void addValue(String newValue) {
service.addValue(newValue);
}
}
好的,现在我通过表单添加新值,并打开下拉列表。但是列表并没有真正更新,因为 DropdownMenuView 上的“值”列表仍然相同。
我的问题是,如何在提交表单后更新“值”?有没有办法不将 DropdowneMenuView 注入 NewValuesView 并手动更新?
我现在看到的唯一方法是实现“事件类”之类的东西,在值更新后触发一个事件并在 getter 中检查这个类。
Eventholer 虚拟实现:
public class EventHolder {
private static boolean event;
public static void fire() {
event = true;
}
public static boolean poll() {
boolean res = event;
event = false;
return res;
}
}
第 2 页:
public class NewValuesView {
@Inject
private ValuesService service;
public void addValue(String newValue) {
service.addValue(newValue);
EventHolder.fire();
}
}
第1页:
public class DropdownListView {
...
public List<String> getValues() {
if (EventHolder.poll()) {
values = service.getValues();
}
return values;
}
}
但我知道将逻辑放入 getter/setter 是一种不好的方法。
那么,有什么建议吗?
谢谢。
【问题讨论】:
标签: jsf master-detail session-scope