2013-02-19 6 views
47

가정하자 나는이 다음 사용자 :AngularJS에서 ng-repeat에서 객체 데이터 소스를 정렬하는 방법은 무엇입니까?

$scope.users = { 
    "2": { 
    email: '[email protected]', 
    name: 'John' 
    }, 
    "3": { 
    email: '[email protected]', 
    name: 'Elisa' 
    } 
} 

나는 다음과 같은 옵션이있는 <select>를 만들 싶습니다

<option value="3">Elisa</option> 
<option value="2">John</option> 

즉, 사용자는 이름으로 분류되어야한다.

나는하여 (key, value) in expression 구문을 사용하여 다음과 같은 시도했지만 작동하지 않습니다 :

<option ng-repeat="(user_id, user) in users | orderBy:'user.name'" 
     value="{{ user.id }}"> 
    {{ user.name }} 
</option> 

Live example here.

내가 무엇을 놓치고?

ng-options과 호환되지 않는 ui-select2을 사용하므로 해결책을 ng-options과 함께 제안하지 마십시오.

+0

로 데이터를 변환해야합니다. 적절한 위키를 추가하고 다른 관련 질문에 태그를 추가하여 태그에 도움을주십시오. 태그에 대한 다른 질문을 찾을 수 없다면 두 번 이상 존재할 필요가 없습니다. – Charles

+2

'ng-repeat'와'orderBy'는 AngularJS에서 매우 일반적입니다. 나는이 둘에 관해서 더 많은 질문이있을 것이라고 믿는다.그러나 어쨌든이 태그를 다른 질문에 추가했습니다. –

+0

정식으로 대체 철자를 제안하는 명성이 부족하기 때문에 여기에있는 누군가가 ** angularjs-order-by **를 추가해야합니다. 낙타가'ngRepeat'를'ng-repeat','orderBy'가'orderby'가되는 것은 무의미한 것으로 보인다. – maurice

답변

52

을 당신은 링크에서 저자의 답변을 참조, 나는 언급 한 해결 방법 중 하나를 넣어 좋은 것이라고 생각 스레드에서 볼 것이지만 up on SO :

기술적으로 구현되지 않았지만 데이터 모델을 약간 변경하려는 경우 쉽게 해결할 수 있습니다. 사용자 정의 필터를 사용하여 객체 속성의 배열을 생성합니다 없이 대체). 당신은 객체 (위의 경우에는 "ID")를 키 필드를 추가 할 경우, 당신은 행동을 얻을 수 있어야합니다 당신을 찾고 : 여기

app.filter("toArray", function(){ 
    return function(obj) { 
     var result = []; 
     angular.forEach(obj, function(val, key) { 
      result.push(val); 
     }); 
     return result; 
    }; 
}); 
... 

$scope.users = { 
    1: {name: "John", email: "[email protected]", id: 1}, 
    2: {name: "Elisa", email: "[email protected]", id: 2} 
}; 

사용할 수있는 NG-반복 지시자는 다음과 같습니다

<option value="{{user.id}}" ng-repeat="user in users | toArray | orderBy:'name'">{{user.name}}</option> 

여기는 plunkr입니다.

orderBy 필터의 매개 변수는 user.name이 아니라 name입니다.

불행히도 id 속성을 개체에 추가하면 포함 된 개체의 키와 일치하지 않을 가능성이 있습니다.

답장에서 언급 한 링크에는 사용자 개체에 id 속성을 즉석에서 만드는 솔루션이 있지만이 방법이 데이터 복제를 도입하는 데 드는 비용이 다소 들지 않습니다.). 허용 대답에 추가하고 데이터 형식을보고

+0

@ BarthZalewski 그러나 필터를 바꾸지 않으려 고하면 어떻게 되나요? 상황에 반대로 처리 할 수 ​​있습니까? ng-repeat = "사용자의 toArray | orderBy : 'name': reverse" – ak85

+0

사용자의 (키, 값) 접근 방식을 사용할 때도 마찬가지입니다. 잘 했어! –

+1

@ ak85의 질문에 대한 응답으로 ng-repeat = "사용자의 toArray | orderBy : user : 'name': true"를 사용하여 목록을 뒤집을 수 있습니다. Boolean true는 역순을 나타냅니다. – Doug

0

, 당신은 우리는 두 개의 새로운이 질문에 대한 태그와이 질문 만하지 않아도

app.filter('myFilterUsers',function(){ 
    return function(data) 
    { 
     var newRes = []; 
     angular.forEach(data,function(val,key){ 
      val["id"] = key; //Add the ID in the JSON object as you need this as well. 
      newRes.push(val); 
     }); 
     return newRes; 
    } 
});