2017-09-24 154 views
0

比方说,我有一个JSF页面,在顶部有一个共同的下拉菜单(标题)和一个用于向此菜单添加新值的窗体。而且我在表单中有一个绝对正确的属性“更新”'ajax'标签(我的意思是,提交表单后更新页面上的下拉菜单)。重点在于下拉菜单和添加值表单具有不同的视图类。重新加载bean属性

第一招:

@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上的'values'列表仍然是一样的。

我的问题是,如何在提交表单后更新'值'?有没有注入DropdowneMenuView到NewValuesView并手动更新它的方法?

我现在看到的唯一方法是实现类似“events class”的事情,在值更新后触发一个事件并在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(); 
    } 
} 

和页面:

public class DropdownListView { 

    ... 

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

但我知道,放逻辑getter/setter方法是不好的方法。
那么,有什么建议?
谢谢。

回答

0

也许,这是因为@Inject标注的默认范围是依赖伪范围@Dependent

CDI采用了所谓的依赖伪范围。这是没有显式声明范围类型的bean的默认范围。 [...]从属bean的实例永远不会在不同的客户端或不同的注入点之间共享。它完全是一些其他对象的依赖对象。当它所属的对象被创建时被实例化,并且当它所属的对象被销毁时被销毁。

所以,当你宣布你的服务ValuesService尝试使用一个正常的范围内(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#dependentcontext