2016-04-11 67 views
3

我最近將我的應用程序從angularjs v1.2升級到v1.5。在v1.2 angularjs是在下拉菜單中自動排序基於鍵/值的對象。但現在,當我升級到1.5時,我的網絡應用程序中的每一個淹沒都以隨機順序顯示項目(即來自db的訂單)。是否有可以在1.5中啓用的全局參數來再次獲得自動分類功能?angularjs 1.5:如何啓用鍵值對象的自動排序?

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

我創建了普拉克兩個版本ellaborate清楚的問題,

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

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

回答

0

Check out this plunk.

你所要做的就是添加一個功能objectKeys這樣

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

,然後替換我們使用的是與此功能的NG選項的對象。

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

是的,目前正在做類似的事情! – FarazShuja

3

Always have a look at the migration guide before migrating to new version.

v1.2 angularjs是自動排序的鍵/值下拉基於對象。但現在,當我升級到1.5每一個淹沒在我的網絡應用程序顯示項目隨機順序。

From MDN article

在一個 對象,以任意順序的可枚舉的性能的for...in語句迭代。

AngularJS 1.5.0ng-options指令中使用getOptionValuesKeys()方法來獲取密鑰的陣列。在該方法中,他們使用不保證迭代順序的for...in。這就是爲什麼下拉列表中的值未被排序的原因。

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; 
} 

AngularJS 1.2.28ng-options指令中使用sortedKeys()方法來獲取密鑰的陣列。他們還在此方法中使用了for...in,但在返回數組之前對數組進行了排序。

function sortedKeys(obj) { 
    var keys = []; 
    for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     keys.push(key); 
    } 
    } 
    return keys.sort(); 
} 

是否有全局參數,我可以在1.5允許再次拿到自動排序功能?

是的,但可能是你不應該改變。爲此,您必須在AngularJS源代碼中對getOptionValuesKeys方法的返回值進行排序。改進的方法應該是這樣的:

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(); 
} 

其他問題可能會出現:爲什麼角隊取得這種變化?

Migrating from 1.3 to 1.4:使用中使用的元素的(key, value)obj語法爲了在一個對象的屬性進行遍歷時,您也可以在ngOptions

由於7fda214c,看看更改字母順序排序 。這是人爲地嘗試創建確定性排序,因爲瀏覽器不保證順序。但是 實際上這不是人們想要的,所以這個改變按照Object.keys(obj), 返回的順序在屬性上重複 ,這幾乎總是定義屬性的順序。

注:

這種變化是在AngularJS 1.4.0作出,而不是在1.5.0。在從1.2.28遷移時,應考慮從版本1.3.01.5.0的所有更改。