2016-05-12 58 views
0

我正在使用帶有onclick動作的p:按鈕。 (我不能移動到號碼:的commandButton,因爲在fa​​ces-config.xml中和自定義導航歷史遺留的結果導航分貝):p:帶onclick javascript鉤子的按鈕

<p:remoteCommand name="unlock_tt" actionListener="#{ttEntityMBean.unlock()}"/> 
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" onclick="unlock_tt()"/> 

通過primefaces的JavaScript看起來像

onclick="unlock_tt(); window.open(....)" 

生成點擊按鈕後,啓動瀏覽器中的unlock_tt(),但立即被頁面重定向破壞,所以支持的java方法沒有執行。 我應該使unlock_tt()或java調用異步,以確保它將在瀏覽器離開頁面之前執行?

UPD:我想使用的號碼:的commandButton,如果有可能去-view-id的programically,像這樣的問題:

Programmatically get navigation case <to-view-id> from faces-config.xml by outcome

<p:commandButton action="#{ttEntityBean.unlock()}"/> 
public String unlock() { 
    //some business logic 
    return OutcomeResolverHelper.getRuleFor(navigationMenuItemToRedirect.navigationRule) 
} 

這應該減少數量的要求

回答

0

最簡單的方法是從p:button遷移到p:commandButton,它允許在重定向之前執行一些java代碼的action方法。核心是導航規則的programmical翻譯,faces-config.xml中定義的基本URL,在explisit JSF的2.0式可使用:

//receive base url from <to-view-id> tag 
public static String resolveOutcomeRule(String ruleName) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ConfigurableNavigationHandler configNavHandler = (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler(); 
    NavigationCase navCase = configNavHandler.getNavigationCase(context, null, ruleName); 
    return navCase.getToViewId(context); 
} 
//decorate it with faces-redirect=true and our custom navigation 
public static String resolveOutcome(NavigationMenuItem item) { 
    return resolveOutcomeRule(item.getNavigationRule()) + "?faces-redirect=true&menu=" + item.getId(); 
} 
//controller-method 
public String cancelEditTT() { 
    super.unlock(); 
    return FacesUtil.resolveOutcome(getNavigationMenuItemToRedirect()); 
} 
//new jsf button: 
<p:commandButton value="#{msgs['button.ok']}" action="#{ttEntityMBean.cancelEditTT}"/> 

將此溶液提供1-步驟重定向代替2-步驟舊的。

0

我不知道這會工作,但你可以試試這個:

相反的:

<p:remoteCommand name="unlock_tt" actionListener="#{ttEntityMBean.unlock()}"/> 
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" onclick="unlock_tt()"/> 

做:

<h:panelGroup> 
<f:ajax event="click" listener="#{ttEntityMBean.unlock}"/> 
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" /> 
<h:panelGroup> 

不要忘記的onclick和你remotecommand刪除。

這應該在您的按鈕周圍包裝panelGroup。 PanelGroup實現了ClientBehaviorHolder,因此它可以在其子節點中獲得f:ajax標記。因此,當你點擊它時,它應該觸發監聽器。