2016-04-11 10 views
3

Ich habe kürzlich meine Anwendung von angularjs v1.2 auf v1.5 aktualisiert. Unter v1.2 wurde angularjs automatisch Schlüssel/Wert-basierte Objekte im Drop-Down-Menü sortiert. Aber jetzt, als ich auf 1.5 verbesserte, zeigt jeder, der auf meiner Netz-APP ertrinkt, Einzelteile in der gelegentlichen Reihenfolge an (d. H. Auftrag, der von db kommt). Gibt es irgendeinen globalen Parameter, den ich in 1.5 aktivieren kann, um diese automatische Sortierfunktion wieder zu bekommen?angularjs 1.5: Wie aktiviert man die automatische Sortierung von Schlüsselwerten?

app.controller('MainCtrl', function($scope) { 
    $scope.days = { 
    'key1': 'val1', 
    'key7': 'val7', 
    'key3': 'val3', 
    'key9': 'val9', 
    'key2': 'val2', 
    'key5': 'val5', 
    'key4': 'val4', 
    }; 
}); 

Ich habe zupfen für beide Versionen das Problem offenbar zu ellaborate,

ver 1.2 https://plnkr.co/edit/o0KJXjW25nlvDoKliHV0?p=preview

ver 1.5 https://plnkr.co/edit/TudDwMhaAREhGVl5vz2c?p=preview

Antwort

0

Check out this plunk.

Was Sie tun müssen, ist eine Funktion hinzufügen objectKeys wie diese

$scope.objectKeys = function(obj){ 
    return Object.keys(obj).sort().map(function(k) { return obj[k] }); 
}; 

Und dann das Objekt ersetzen wir mit dieser Funktion auf den ng-Optionen.

<select ng-model="test" ng-options="k as v for (k,v) in objectKeys(days)" /> 
+0

Yeah, mache derzeit ähnliche Dinge wie diese !! – FarazShuja

3

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.

Verwandte Themen