我有一个由jQuery填充的选择框。这些选项是通过REST调用从服务器获取的,然后用于填充选择框。
应用程序也应该脱机工作,但离线时这些REST调用失败。所以我正在做的是当REST调用实际通过时,我将这些值存储在localStorage
内,当离线并且REST调用失败时,我只是在localStorage中获取存储的值并尝试填充选择框。
但是选择框仍然显示为空。我在控制台中打印了存储的值,并显示实际成功存储和检索的这些值。我不确定为什么我的选择框仍然显示为空。
$.getJSON("/openmrs/ws/rest/v1/location", function(result) {
var locations = $("#identifierLocations");
localStorage.setItem("locations", result.results);
$.each(result.results, function() {
locations.append($("<option />").val(this.uuid).text(this.display));
});
}).fail(function(jqXHR, textStatus, errorThrown) {
var data = localStorage.getItem("locations");
if (data) {
var locations = $("#identifierLocations");
for (var i = 0; i < data.length; i++) {
locations.append($("<option />").val(data[i].uuid).text(data[i].display));
}
}
});
我在console.log
中使用了.fail()
,我可以确认数据实际上已经存储了所有位置对象,但为什么我的选择框仍然显示为空。
答案 0 :(得分:2)
问题是因为localStorage
只能保存字符串。您需要在存储它们之前序列化result.results
,然后在检索它们时进行反序列化。试试这个:
$.getJSON("/openmrs/ws/rest/v1/location", function(result) {
localStorage.setItem("locations", JSON.stringify(result.results));
populateLocations(result.results);
}).fail(function(jqXHR, textStatus, errorThrown) {
var data = localStorage.getItem("locations");
if (data) {
populateLocations(JSON.parse(data));
}
});
function populateLocations(locations) {
var html = locations.map(function(o) {
return '<option value="' + o.uuid + '">' + o.display + '</option>';
}).join('');
$("#identifierLocations").html(html);
}