私はjQueryMobileを使用して、データベースに保存されている情報から一連のリストビューを作成しています。各リストビューは、親子関係で次のリストビューを作成します(例:最初のリストビューでは動物を選択でき、犬を選択し、次のリストを選択できます)ビューには血統などが表示されます)。
現在、私のコードはリストビューに適切にデータを入力します。問題は、親リストビューに戻って別の選択を行うと、子リストビューが更新されず、大量の情報が追加されることです。私はどこでもたくさん読んだことがありますが、私のコードの適切な実装を見つけることができないようです。
<ul data-role="listview" data-filter="false" data-inset="true" data-theme="a" data-divider-theme="a">
<li>
<label for="pet" class="select">Pet</label>
<select id="pet" data-mini="true" onchange="fill_list('pedigree', this);">
<option value=""></option>
</select>
</li>
<li>
<label for="pedigree" class="select">Pedigree</label>
<select id="pedigree" data-mini="true" onchange="fill_list('pet_name', this);">
<option value=""></option>
</select>
</li>
<li>
<label for="pet_name" class="select">Pet Name</label>
<select id="pet_name" data-mini="true">
<option value=""></option>
</select>
</li>
</ul>
function fill_list(next_list, this_list){
var pet_url = server_root_url + 'controler/pet/find_pet.php';
var value = this_list.options[this_list.selectedIndex].value;
var params = {
control: next_list,
value: value
};
$.ajax({
type: "POST",
url: pet_url,
async:false,
data: params,
success: function(json){
do_fill_list(json, next_list);
}
});
}
function do_fill_list(json, next_list){
var x = "#" + next_list;
var option = $(x);
/*------------------------------------------------------------------------------
EDIT:
Below is the solution I found for this issue.
Basically we capture the current list with the switch, empty it,
append it with a blank line, then let the rest of the code populate the list.
-------------------------------------------------------------------------------*/
switch(next_list){
case "pet":
options.html("").append("<option />");
break;
case "pedigree":
options.html("").append("<option />");
break;
case "pet_name":
options.html("").append("<option />");
break;
}
//-------------------------------------END EDIT------------------------------------
$.each(json.control,
function(i,control){
switch(next_list){
case "pet":
option.append($("<option />").val(control.pet).text(control.pet));
break;
case "pedigree":
option.append($("<option />").val(control.pedigree).text(control.pedigree));
break;
case "pet_name":
options.append($("<option />").val(control.pet_name).text(control.pet_name));
break;
}
}
);
}
データのバックエンドフェッチを処理するためにPHP関数を呼び出しますが、テストする必要がある場合は、このデータをハードコーディングできることに注意してください。また、最後のJS関数にコメント行があります。これについてはよく読んでいます。問題を解決するために実装する必要があるrefreshメソッドです。私はこれを行うための無数の方法を試しましたが、明らかに十分ではありません。
編集:この問題を解決するswitchステートメントを追加しました。これは「dofilllist」JSメソッド内にあります。