我希望标题是自我解释的。我使用jQuery mobile从存储在数据库中的信息填充一系列列表视图,每个列表视图在父子关系中填充以下一个(例如:第一个列表视图允许您选择动物,您选择狗,下一个列表视图中填充了谱系,等等。
现在我的代码正确地填充了列表视图,我遇到的问题是,如果我回到父列表视图并进行不同的选择,子列表视图不会刷新,我们最终得到一堆附加信息。我到处都阅读了很多内容,但我似乎无法为我的代码找到合适的实现。
HTML内容(正文):
<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>
JS:
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函数中有一个注释行,我已经阅读了很多:刷新方法,应该实现以解决我的问题。我尝试了无数种方法,显然还不够。
编辑:我添加了一个解决此问题的switch语句,它位于“do fill list”JS方法中。
答案 0 :(得分:1)
修改强>
抱歉,我注意到它的移动设备太晚了。尝试$(next_list).selectmenu('refresh', true);
:(
答案 1 :(得分:0)
下面的代码是我的问题的解决方案(参见上面的完整代码和编辑过的代码。基本上所有需要做的就是捕获选定的列表视图,清空它并附加一个空选项。为什么一个空选项?因为否则你会点击列表视图,你将无法选择第一个选择;如果你想改变它,你就无法选择它。
将此代码插入到do_fill_list方法中,就在var option = $(x)之间;和$ .each(json.control(...)函数:
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;
}
可以增强此代码,以便在更改父选择时清除子选择。我仍然在研究这项功能,如果有人需要它,你可以要求它,我相信我会很快完成它。