2017-07-06 107 views
1

我開發一個JSF複合材料,其獲得一個複雜的數據結構作爲參數:使用在所述調用的init()方法JSF複合材料不存儲狀態與StateHelper

<cc:interface componentType="MyComponent"> 
    <cc:attribute name="myModel" required="true"  type="my.package.Model" /> 
</cc:interface> 

背襯組件處理該模型通過事件的複合:

<cc:implementation> 
     <f:event type="postAddToView" listener="#{cc.init}" /> 
     [...] 
    </cc:implementation> 

在我檢查,如果該模式已被處理(因爲我不想這樣做,每次爲用戶停留在頁面上,例如,通過Ajax請求對這個init()方法)。因此,我存儲經由StateHelper.put()的處理的模型:

public void init() 
{ 
    if (getMyModel() == null) 
    { 
     MyModel model = processModel(...); 
     setMyModel(model); 
    } 
} 

@SuppressWarnings("unchecked") 
public MyModel getMyModel() 
{ 
    return (MyModel) getStateHelper().get("MyModel"); 
} 

public void setMyModel(MyModel MyModel) 
{ 
    getStateHelper().put("MyModel", MyModel); 
} 

我現在期待的是,如果在init()方法Ajax請求期間被調用,例如(在同一視圖中範圍)它不處理該模型是第二次,因爲我通過StateHelper將它存儲在視圖範圍中。但是不管我嘗試什麼,如果我點擊帶有void/null結果的命令鏈接,getMyModel()方法總是返回null。 任何想法?

回答

2

在後臺組件中實現restoreState()方法,並設置斷點顯示問題。處理postAddToView事件之前調用restoreState()。用preRenderView代替我解決了這個問題。