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.0,ng-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.28,ng-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.0
到1.5.0
的所有更改。
是的,目前正在做類似的事情! – FarazShuja