2014-10-16 5 views
4

저는 AngularJS를 처음 사용 합니다만, 지금까지 모든 것을 내 머리 속에 감쌀 수있었습니다. 하지만 OrderBy가 문제를 일으키고 있습니다. 그리고 나는 아직 어떤 문제도 발견하지 못했습니다. 나는 $ scope와 orderBy가 실제로 어떻게 작동하는지에 대해 뭔가를 놓치고 있다는 느낌이 들었습니다.맞춤 함수가있는 AngularJS OrderBy

나는이 지역 NaNoWriMo에 작가를 표시 할 목록을 만들고 있습니다. 사용자를 공장으로 분리하여 표시했습니다. 그러나 나는 그들을 분류하는 데 문제가있다. 이름과 단어 수는 문제없이 정렬됩니다. 그러나 계산 된 평균 단어 수는 전혀 정렬되지 않습니다. 그것은 그것을 위해 만든 함수를 호출하지 않습니다.

여기 내 간단한 레이아웃과 JSFiddle setup (updated)입니다.

JS :

(function() { 
var app = angular.module('userList', []); 

app.controller('ListController', ['$scope', 

function ($scope) { 
    $scope.users = userData; 
    $scope.day = 30; 

    $scope.avgWords = function (user) { 
     return Math.floor(user.wordcount/$scope.day); 
    }; 

    $scope.sort = "name"; 
    $scope.sortRev = false; 

    $scope.sortChange = function (field) { 
     if ($scope.sort === field) { 
      $scope.sortRev = !$scope.sortRev; 
      return; 
     } 

     $scope.sort = field; 
     $scope.sortRev = false; 
    }; 

    $scope.sortAvg = function (user) { 
     alert("sorted!"); 
     return Math.floor(user.wordcount/$scope.day); 
    }; 
}]); 

var userData = [{ 
    "name": "Kris", 
     "wordcount": 42382 
}, { 
    "name": "Tim", 
     "wordcount": 60120 
}, { 
    "name": "Elsa", 
     "wordcount": 150675 
}]; 
})(); 

HTML :

<div ng-controller="ListController"> 
<table> 
    <thead> 
     <tr> 
      <th ng-click="sortChange('name');">Username</th> 
      <th ng-click="sortChange('wordcount');">Total Words</th> 
      <th ng-click="sortChange('sortAvg');">Average WPD</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr ng-repeat="user in users | orderBy:sort:sortRev"> 
      <td>{{user.name}}</td> 
      <td>{{user.wordcount}}</td> 
      <td>{{avgWords(user)}}</td> 
     </tr> 
    </tbody> 
</table> 

답변

1

당신이 평균 WPD 제목을 클릭하면, 당신은 문자열 "avgWords"에 $ scope.sort을 설정합니다. 따라서 orderBy는이 문자열을 사용하여 사용자를 정렬하므로 사용자에게 avgWords 필드의 값으로 주문합니다 (항상 undefined). 이 필드가 아닌 사용자 정의 기능을 사용하여 정렬 할 경우

, 당신은 당신이 정렬 기준으로 사용할 함수에 $scope.sort를 설정해야합니다

$scope.sort = $scope.avgWords; 

그렇게하려면 제목에 NG가 클릭해야 be

sortChange(avgWords) 
+0

아 등의 각 열은 해당 속성에 의해 필터링 할 수 있습니다 방법 ... 그래서 뭔가, 나는 그것을 놓쳤다. 그렇게 설정되어 있어야합니다. [다음은 업데이트 된 바이올린입니다.] (http://jsfiddle.net/btronk/6dma7yhc/1/). 그러나 문제는 여전히 동일합니다. 함수에 해당하는 sortChange ('sorgAvg')로 클릭을 설정했지만 절대 호출되지 않습니다. –

+0

이제 나는 내가하고있는 것을보고있다. 네가 옳아. 이 문제는 sortChange ('avgWords')와 sortChange (avgWords) 호출의 차이점입니다. 하나는 속성을 찾고 다른 하나는 함수를 찾습니다. 이 모든 시간, 그리고 그것은 2에 의해 발생했습니다 ''! 감사. –

+0

정말 정확하려면 다른 하나는 특별히 기능을 찾지 않습니다. 해당 유형이 무엇이든 avgWords라는 현재 범위의 속성을 찾습니다. –

2

항상 평균 단어 속성을 범위의 사용자 배열에있는 개체에 추가 할 수 있습니다.

http://jsfiddle.net/poppypoop/swer05sx/

$scope.users = userData; 
    $scope.day = 30; 

     for(var i=0; i < $scope.users.length; i++){ 
     $scope.users[i].avgWords = Math.floor($scope.users[i].wordcount/$scope.day); 
    } 
+0

나는 똑같은 생각을 가지고 있었지만,이 문제는 사용자가 동적으로 추가 될 수 있다는 것입니다. 새 사용자는 업데이트하지 않고 처음로드 한 사용자 만 업데이트합니다. –

+0

이 방법은 더 의미가 있습니다. avgWords는 당연히 '사용자'의 속성이어야합니다. 이 [피들] (http://jsfiddle.net/6dma7yhc/2/)도 확인하십시오. Xhr 요청이 끝나면 바로 추가하십시오. – shxfee