私は2回のドロップダウンを使用してフォームを持っています。最初のドロップダウン選択値が変更されると、アプリケーションはAjaxコールを作成して、新しいリストを2番目のドロップダウンに表示させます。
選択した国でフィルタリングされた州/州のリストと考えることができます。
最初のドロップダウンはcountryDropDownで、2番目のドロップダウンはstatesDropDownです。
コードサンプル
JSP
<html:select name="countries"
property="countryName"
indexed="true"
onchange="onCountryChange(this, 'states${index}')">
<html:optionsCollection name="myViewModel" property="countries" />
</html:select>
<html:select styleId="states${index}"
name="states"
property="name"
indexed="true">
<html:optionsCollection name="myViewModel" property="states" />
</html:select>
Javascriptを
function onCountryChange(countriesDropDown, statesDropDownId) {
var country = $(countriesDropDown).val();
$.ajax({
type: 'POST',
url: makeURL('/ent/refreshStates.do'),
async: false,
data: "country:" + country,
success: function(states) {
populate(statesDropDownId, states);
},
failure: function(e) {
showAlert(e);
}
});
}
// In the following function, states is a list of ListValueBean.
function populate(statesDropDownId, states) {
var statesDropDown = $(statesDropDownId);
statesDropDown.empty();
for(var i=0; i<states.length; i++) {
statesDropDown.append("<option></option>")
.attr("value", states[i].value)
.text(states[i].label);
}
}
レンダリングされたHTML
<select name="states[0].state" id="states0" data-size="10" style="display: none;">
<option value="5052">MO</option>
<option value="5051" selected="selected">CA</option>
...
</select>
<div class="btn-group boostrap-select">
<button type="button" class="btn dropdown-toggle selectpicker btn-default" data-toggle="dropdown" data-id="states0" title="5051">
<span class="filter-option pull-left">CA</span>
" "
<span class="caret">::before</span>
</button>
<div class="dropdown-menu open">
<ul class="dropdown-menu inner selectpicker" role="menu">
<li rel="0" class="selected">
<a tabindex="0" class style>
<span class="text">CA</span>
<i class="glyphicon glyphicon-ok icon-ok check-mark"></i>
</a>
</li>
</ul>
</div>
</div>
select
のレンダリングが、隠れて、ブートストラップにより、私が見る制御がボタンに変更されているように思えます。
したがって、selectに値が設定されても、選択されているものに基づいてこのラッパーボタンを更新することはできません。 :(
現状
現在の動作は、サーバーへのラウンドトリップがうまく機能し、すべてが期待どおりにドロップで更新されることは決してありませんの状態を除いて、ちょうどであるということですダウン。
それでは、どのようにそれを動作させるには?
まあまあ、statesDropDownのIDルックアップが有効なIDセレクタになるように、その前面に「#」が付いているかどうかわかりません。あなたはonchange呼び出しの文字列にその文字列を入れるか、populateメソッドの先頭にそれを付加したいでしょう。 – Taplar
jsfiddleでexempleを作成してコードを演奏できますか? – rm4
'console.log(statesDropDown)'を実行した場合、期待するオブジェクトが返されますか? – kyle