2017-09-24 139 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