2013-08-22 74 views
2

我瀏覽過所以發現一些答案已經引導我更接近獲取工作單選按鈕,但我現在卡住了。使用twitter bootstrap的單選按鈕 - 無法獲得價值

我有按鈕,但無法獲取所選的值。

我使用JSF,因此#{searchFlightsBean.setDir()}

這是我目前有:

<h:panelGrid> 
    <div class="btn-group" data-toggle-name="is_private" data-toggle="buttons-radio" > 
     <button type="button" value="0" class="btn" data-toggle="button">Public</button> 
     <button type="button" value="1" class="btn" data-toggle="button">Private</button> 
    </div> 
    <h:inputHidden id="hiddenDir" value="0" valueChangeListener="#{searchFlightsBean.setDir()}" onchange="submit()"/> 
</h:panelGrid> 

<script> 
$(function() { 
    $('div.btn-group[data-toggle-name]').each(function() { 
     var group = $(this); 
     var form = group.parents('form').eq(0); 
     var name = group.attr('data-toggle-name'); 
     var hidden = $('input[name="' + name + '"]', form); 
     $('button', group).each(function() { 
      var button = $(this); 
      button.on('click', function() { 
       hidden.val($(this).val()); 
      }); 
      if (button.val() == hidden.val()) { 
       button.addClass('active'); 
       #{searchFlightsBean.setDir(button.value)} 
      } 
     }); 
    }); 
}); 
</script> 

在我的豆,當setDir()叫,我記錄它接收到,像這樣的價值:

public void setDir(ValueChangeEvent e) { 
    this.dir = e.getNewValue().toString(); 
    log.info("NEW DIRECTION: " + this.getDir()); 
} 

它不記錄 - setDir()永遠不會被調用。由於某些原因,​​標記上的valueChangeListener屬性不起作用。我錯過了什麼嗎?

+0

沒有人的答案真的能解決您的問題嗎?對我而言,他似乎只是發佈了一個完全隨機的解決方案,它更多地適用於JSF 1.x,而不適用於JSF 2.x,但您標記的答案已被接受。你真的*在RichFaces 3.x中使用JSF 1.x嗎?先前提出的問題中沒有任何內容表明這一點如果您仍然面臨同樣的主要問題,那麼您不應該標記接受的答案,因此答案根本沒有幫助。 – BalusC

+0

@BalusC不,它沒有真正回答我的問題 - 我沒有接受它。我也編輯了我的問題,使其與我目前正在嘗試做的事情保持一致。要麼我使用valueChangeListener錯誤,要麼我需要使用別的東西。 – Skytiger

+0

好的。只需確認一下,您正在使用JSF 2.x?因此,你可以使用''? – BalusC

回答

1

你的具體問題引起的。

<h:inputHidden ... valueChangeListener="#{searchFlightsBean.setDir()}"> 

這與方法簽名不匹配。你應該省略括號()

<h:inputHidden ... valueChangeListener="#{searchFlightsBean.setDir}"> 

否則JSF預計沒有爭議的setDir()方法。然後,您無法在JavaScript中觸發輸入元素上的change事件。因此從不調用onchange="submit()"。你應該在JS中做hidden.trigger("change")來達到這個目的。

但是,畢竟,這是有點笨拙。你發送一個完整的同步請求,你的JS代碼相當複雜(一旦你更新了表單,就停止工作)。假設您使用JSF 2.x進行了indeeed,我建議引入<f:ajax> —,但不幸的是,它不會在<h:inputHidden>中工作,因此<h:inputText style="display:none"> —以及在jQuery中利用$.on()來保持函數正常工作,即使您使用ajax-更新DOM。

<h:form> 
    <div class="btn-group" data-toggle-name="is_private" data-toggle="buttons-radio" > 
     <button type="button" value="0" class="btn" data-toggle="button">Public</button> 
     <button type="button" value="1" class="btn" data-toggle="button">Private</button> 
    </div> 
    <h:inputText id="is_private" value="#{bean.dir}" style="display: none;"> 
     <f:ajax listener="#{bean.changeDir}" /> 
    </h:inputText> 
    <!-- Note: <h:inputText id> must be exactly the same as <div data-toggle-name> --> 
</h:form> 

<h:outputScript> 
    $(document).on("click", "[data-toggle=buttons-radio] button", function() { 
     var $button = $(this); 
     var id = $button.closest(".btn-group").attr("data-toggle-name"); 
     var $input = $button.closest("form").find("input[id$=':" + id + "']"); 

     if ($input.val() != $button.val()) { 
      $input.val($button.val()).trigger("change"); 
     } 
    }); 
</h:outputScript> 

(注意應該是整個腳本真正應該放在自己的.js文件,你包括由<h:outputScript name="some.js" target="body">;請注意,你不需要$(document).ready()也不$(function() {})混亂;也注意到,非常JS功能是所有其他<div data-toggle="buttons-radio">組沒有變化)

有了這個bean可重複使用:

private Integer dir; 

public void changeDir() { 
    System.out.println("New direction: " + dir); 
} 

// ... 

(注意應該是,當你在changeDir()方法中進一步沒有任何相關時,那麼你可以完全省略整個方法和<f:ajax>並將<h:inputText style="display:none">還原回<h:inputHidden>並刪除.trigger("change")並依賴於常規表單提交。它會一樣好)

1

你不能在JavaScript中通過表達式語言調用(#{...})調用任何支持bean函數。

你可以做的是使用a4j:jsFunction爲你的bean方法提供java腳本代碼。這可能是這樣的:

<a4j:jsFunction name="setDir" action="#{searchFlightsBean.setDir()}" ajaxSingle="true"> 
    <a4j:param name="dir" assignTo="#{searchFlightsBean.dir}" /> 
</a4j:jsFunction> 

見,因爲你使用valueChangeListener走錯了路http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/a4j_jsFunction.htmlhttp://showcase.richfaces.org/richfaces/component-sample.jsf?demo=jsFunction&skin=blueSky

+0

謝謝。我只是注意到,我得到一個JS錯誤(顯然我不能調用'button.live'。 我怎麼會從我的JS調用ajax? – Skytiger

+0

@Skytiger請參閱展示示例。使用RichFaces中包含的A4J庫,你需要使用一些擴展來處理JS和JSF之間的橋接,否則你需要一些不太好的黑客技巧。請參閱http://stackoverflow.com/questions/3710908/ jsf-2-0-ajax-call-a-bean-method-from-javascript-with-jsf-ajax-request-or-some – noone

+0

謝謝,但A4J圖書館不會爲我剪下它。嘗試另一種解決方法。 – Skytiger