Ich schaute dies ein wenig und zuerst dachte, es sollte ähnlich zu anderen Postings sein, aber Sie sortieren nicht entweder durch die ID oder den Namen (Text), sondern durch einen anderen Wert. Um das zu erleichtern, habe ich ein Objekt erstellt, das alle Länder und Städte enthält und dann einfügt. Ich sortiere dann mit einem sortOrder, der in die Optionsliste geschoben wird, als data-sort
und eine Funktion, um die Sortierung durchzuführen.
Ich sehe Ihre currentCity
, aber das würde sich wahrscheinlich bei einem Länderwechsel ändern? Also habe ich für jedes Land einen "Standard" gesetzt, indem ich isDefault:true
auf eine Stadt setze.
Ich schob auch die Länder in der Liste, mit einem Standard dort.
Dies kann für Ihre Situation übertrieben sein, aber nehmen Sie, was Sie möchten.
erstellen Namensraum
var myApp = myApp || {};// create a namespace to use.
ein Land Objekt hinzufügen:
myApp.countries = [{
"name": "United Kingdom",
isDefault: true,
id: 1,
"cities": [{
id: 1,
name: "Bedfordshire",
"sortOrder": 1,
"isCapital": false
}, {
id: 2,
name: "Berkshire",
"sortOrder": 2,
"isCapital": false
}, {
id: 3,
name: "Birmingham",
"sortOrder": 3,
"isCapital": false
}, {
id: 4,
name: "Brighton",
"sortOrder": 4,
"isCapital": false,
isDefault:true
}, {
id: 5,
name: "Buckinghamshire",
"sortOrder": 6,
"isCapital": false
}, {
id: 6,
name: "Appleton",
"sortOrder": 5,
"isCapital": false
}, {
id: 37,
name: "London",
"sortOrder": 0,
"isCapital": true
}]
}, {
"name": "Hackem",
id: 2,
"cities": [{
id: 1,
name: "Somecity",
"sortOrder": 1,
"isCapital": false
}, {
id: 2,
name: "Waterton",
"sortOrder": 2,
"isCapital": false
}, {
id: 3,
name: "Acre City",
"sortOrder": 3,
"isCapital": false
}, {
id: 4,
name: "Jackson",
"sortOrder": 4,
"isCapital": false
}, {
id: 5,
name: "Tolkenshire",
"sortOrder": 6,
"isCapital": false
}, {
id: 6,
name: "Capital City",
"sortOrder": 0,
"isCapital": true
}, {
id: 37,
name: "Paris",
"sortOrder": 4,
"isCapital": false
}]
}, {
"name": "NewCountry",
id: 3,
"cities": [{
id: 1,
name: "Skycity",
"sortOrder": 1,
"isCapital": false
}, {
id: 2,
name: "DirtCity",
"sortOrder": 2,
"isCapital": false
}, {
id: 3,
name: "Airville",
"sortOrder": 3,
"isCapital": false
}, {
id: 6,
name: "Cape Town",
"sortOrder": 0,
"isCapital": true
}, {
id: 37,
name: "Walla Walla",
"sortOrder": 4,
"isCapital": false
}]
}];
einige Funktionen hinzufügen zu verwenden Namensraum:
myApp.arrayObj = myApp.arrayObj || {
lookup: function(myArray, searchTerm, property, firstOnly) {
var found = [];
for (var i = 0; i < myArray.length; i++) {
if (myArray[i][property] === searchTerm) {
found.push(myArray[i]);
if (firstOnly) break; //if only the first
}
}
return found;
},
updateCityOptions: function(countries) {
var $cityAll = $("#ListingCity");
// lookup by text
var $countryText = $("#ListingCountry option:selected").text();
var ac = this.lookup(countries, $countryText, "name", true)[0].cities;
// lookup by id (alternate approach)
// var $countryId = $("#ListingCountry option:selected").val();
// var ac = this.lookup(countries, $countryId , "id", true)[0].cities;
if (ac) {
$('#ListingCity option:gt(0)').remove();
var opt = '<option></option>';
var newOptions = "";
$.each(ac, function(k2, v2) {
// var sel = currentCity == v2.name ? ' selected="selected" ' : "";
var sel = v2.isDefault ? ' selected="selected" ' : "";
opt = '<option data-sort="' + v2.sortOrder + '"' + sel + ' value="' + v2.id + '">' + v2.name + '</option>';
newOptions += opt;
});
$cityAll.append(newOptions); //hit the DOM just once
$cityAll.sortOptions(); // sort what we put in
$(".city").fadeIn(300);
} else {
$cityAll.find('option:gt(0)').remove();
$(".city").fadeOut(300);
}
$cityAll.trigger('change');// because it changed
},
setCountries: function(nation) {
var $countries = $("#ListingCountry");
$countries.find('option:gt(0)').remove();
var opt = '';
var newOptions = "";
$.each(nation, function(k2, v2) {
var sel = v2.isDefault ? ' selected="selected" ' : "";
opt = '<option data-sort="' + v2.sortOrder + '"' + sel + ' value="' + v2.id + '">' + v2.name + '</option>';
newOptions += opt;
});
$countries.append(newOptions); //hit the DOM just once
}
};
Erstellen Sie die Schlüsselsortierfunktion:
// sort the select
$.fn.sortOptions = function() {
$(this).each(function() {
var op = $(this).children("option");
op.sort(function(a, b) {
return $(a).data('sort') > $(b).data('sort') ? 1 : -1;
})
return $(this).empty().append(op);
});
}
Code Startup:
myApp.arrayObj.setCountries(myApp.countries);
// could be done is way but we trigger the country change which does this
// myApp.arrayObj.updateCityOptions(myApp.countries);
das Ereignis Land ändern Griff:
$('#ListingCountry').on('change', function() {
myApp.arrayObj.updateCityOptions(myApp.countries);
}).trigger('change');
Edit: Hinweis Sie könnten alle "isCapital": false
entfernen, wenn Sie möchten nur die "isCapital": true
auf einem und es würde auf die gleiche Weise funktionieren. https://jsfiddle.net/MarkSchultheiss/okk22ovq/2/
EDIT: Bonus;
Probe mit hier spielen alternative Sortieroptionen
Ist London die 'currentCity' im Funktionsargument? Sie können '.prepend' anstelle von' .append' verwenden, um es am Anfang des '
@StuartPinfold, könnten Sie etwas Feedback geben oder die Antwort akzeptieren, die Ihnen am meisten zusagt? – trincot