让我们说,我的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中检查此类。
事件holer虚拟实现:
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;
}
}
但是我知道把吸气剂/安装者的逻辑放在一个坏方法 那么,有什么建议吗? 谢谢。
答案 0 :(得分:0)
或许,这是因为 @Inject 注释的默认范围是从属伪范围 @Dependent
CDI具有所谓的依赖伪范围。这是未明确声明范围类型的bean的默认范围。 [...]从不在不同客户端或不同注入点之间共享依赖bean的实例。它严格来说是某个其他对象的依赖对象。它在创建它所属的对象时被实例化,并在它所属的对象被销毁时被销毁。
因此,当您声明服务 ValuesService 时,请尝试使用正常范围(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#dependentcontext)