Always have a look at the migration guide before migrating to new version.
Auf v1.2
AngularJS war Autosortier Schlüssel/Wert-basierte Objekte in Drop-down. Aber jetzt, als ich auf 1.5
aktualisiere, zeigt jeder, der auf meiner Web-App ertrinkt, Artikel in zufälliger Reihenfolge.
From MDN article
Die for...in
Anweisung iteriert über die zählbaren Eigenschaften ein Objekt, in beliebiger Reihenfolge.
In AngularJS 1.5.0, ng-options
Richtlinie verwendet getOptionValuesKeys()
Methode, um die Anordnung von Tasten zu bekommen. In dieser Methode verwendeten sie for...in
, die die Reihenfolge der Iteration nicht garantiert. Aus diesem Grund sind die Werte in der Dropdownliste nicht sortiert.
function getOptionValuesKeys(optionValues) {
var optionValuesKeys;
if (!keyName && isArrayLike(optionValues)) {
optionValuesKeys = optionValues;
} else {
// if object, extract keys, in enumeration order, unsorted
optionValuesKeys = [];
for (var itemKey in optionValues) {
if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {
optionValuesKeys.push(itemKey);
}
}
}
return optionValuesKeys;
}
In AngularJS 1.2.28 verwendet ng-options
Richtlinie sortedKeys()
Methode, um die Anordnung von Tasten zu bekommen. Sie verwendeten auch for...in
in dieser Methode, aber sortiert das Array vor der Rückgabe.
function sortedKeys(obj) {
var keys = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keys.push(key);
}
}
return keys.sort();
}
Gibt es einen globalen Parameter I in 1.5 aktivieren können wieder, dass die Auto-Sortierfunktion zu bekommen?
Ja, aber möglicherweise sollten Sie nicht ändern. Dazu müssen Sie den Rückgabewert der Methode getOptionValuesKeys
im AngularJS-Quellcode sortieren.Modifiziertes Verfahren soll wie folgt aussehen:
function getOptionValuesKeys(optionValues) {
var optionValuesKeys;
if (!keyName && isArrayLike(optionValues)) {
optionValuesKeys = optionValues;
} else {
// if object, extract keys, in enumeration order, unsorted
optionValuesKeys = [];
for (var itemKey in optionValues) {
if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {
optionValuesKeys.push(itemKey);
}
}
}
return optionValuesKeys.sort();
}
Zusätzliche Frage kann entstehen: Warum Angular Team diese Änderung vorgenommen?
Migrating from 1.3 to 1.4: Werfen Sie einen Blick auf die Veränderungen in ngOptions
Aufgrund 7fda214c, wenn sie über die Eigenschaften eines Objekts mit der (key, value)
in obj
Syntax, um die Reihenfolge der Elemente verwendet Iterieren alphabetisch sortiert werden. Dies war ein künstlicher Versuch, eine deterministische Reihenfolge zu erstellen, da Browser die Bestellung nicht garantieren. Aber in der Praxis ist dies nicht, was Menschen wollen und so iteriert diese Änderung über Eigenschaften in der Reihenfolge, die sie von Object.keys(obj)
, zurückgegeben werden, die fast immer die Reihenfolge ist, in der die Eigenschaften definiert wurden.
Hinweis:
Diese Änderung in AngularJS 1.4.0
, nicht in 1.5.0
gemacht wurde. Wenn Sie von 1.2.28
migrieren, sollten Sie alle Änderungen von Version 1.3.0
zu 1.5.0
berücksichtigen.
Yeah, mache derzeit ähnliche Dinge wie diese !! – FarazShuja