2014-04-25 3 views
0

각 테이블 필드별로 정렬을 사용하고 싶습니다. 프로젝트에서 작업하는 데 몇 분이 걸렸는지를 보여주는 하나의 열이 있지만이 필드로 정렬하면 제대로 작동하지 않습니다.AngularJS 시차 별 정렬

<table> 

    <th ><a href="" ng-click="sortBy='task.company_name'">Company</a></th> 
    <th><a href="" ng-click="sortBy='timediff(task.time_start,task.time_stop)'">Time difference</a><th /> 

    <tr ng-repeat="task in tasks | orderBy:sortBy"> 
     <td >{[{ task.company_name }]}</td> 
     <td >{[{ timediff(task.time_start,task.time_stop) }]}</td> 
    </tr> 

</table> 

timediff 기능 :

$scope.timediff = function(start, end){ 
    var start = moment(start); 
    var end = moment(end); 
    var diff = end.diff(start,'minutes',true); 
    return (diff/60).toPrecision(3); 
}; 

Plunker : http://plnkr.co/edit/vdkfNkgpdLUp9RgZ1IvO?p=preview

+0

성능 조언 : 정렬 된 목록은 특정 순간에 계산되어야합니다. 예를 들어 정렬 기능을 변경할 때 d를'tasks'리스트와 비교하여 콜렉션 워처에 저장합니다. 그렇지 않으면 각 요약주기마다 정렬됩니다. – lib3d

답변

2

간단한 수정, 단지 매개 변수

<tr> 
    <th><a href="" ng-click="sortBy='company_name'">Company</a></th> 
    <th><a href="" ng-click="sortBy='timediff'">Time difference</a></th> 
</tr> 
<tr ng-repeat="task in tasks | orderBy:sortBy"> 
    <td>{{ task.company_name }}</td> 
    <td>{{ task.timediff = timediff(task.time_start,task.time_stop) }}</td> 
</tr> 

에 기능을 할당 할 필요가 0이 표시되며 역순 정렬이 추가됩니다.

+0

빠르고 간단한 솔루션입니다. 여기서 문제가되는 것은 각 작업을 정렬하기 위해서만 속성을 추가한다는 것입니다. 나중에 제거하려면 수동으로 다시 제거해야합니다. 또한 시간 중 하나를 수정하면 (데이터 바인딩없이)'timediff' 속성은 객체에 잘못된 정크가됩니다. –

0

사용자 지정 기능이 작동하는 더 간단한 방법이 있습니다. "Company"와 "Time difference"사이를 전환하기 위해 데이터 세트를 약간 편집했습니다.

옵션 1 (DEMO) :

속성 이름은 다음을 수행 할 수 있습니다를 변경하지 않으면 :

$scope.timediff = function(task){ 
    var start = moment(task.time_start); 
    var end = moment(task.time_stop); 
    var diff = end.diff(start,'minutes',true); 

    return (diff/60).toPrecision(3); 
}; 

그리고 당신의 HTML에 sortBy 변수에 기능을 할당 :

<th ><a href="" ng-click="sortBy='company_name'">Company</a></th> 
<th><a href="" ng-click="sortBy=timediff">Time difference</a></th> 

<tr ng-repeat="task in tasks | orderBy:sortBy"> 
    <td >{{ task.company_name }}</td> 
    <td >{{ timediff(task)}}</td> 
</tr> 

Angular는 현재 항목을에 정의 된 함수에 자동으로 전달합니다..

옵션 2 (유연) (DEMO) :

당신은 즉석에서 속성 이름을 정의하려면 다른 함수를 반환 할 수 있습니다

$scope.timediff = function(name1, name2){ 
    return function(item) { 
     var start = moment(item[name1]); 
     var end = moment(item[name2]); 
     var diff = end.diff(start,'minutes',true); 

     return (diff/60).toPrecision(3); 
    } 
}; 

을 그리고 그것을 두 가지 속성을 제공 이름 :

<th ><a href="" ng-click="sortBy='company_name'">Company</a></th> 
<th><a href="" ng-click="sortBy=timediff('time_start', 'time_stop')">Time difference</a></th> 

<tr ng-repeat="task in tasks | orderBy:sortBy"> 
    <td >{{ task.company_name }}</td> 
    <td >{{ timediff('time_start', 'time_stop')(task)}}</td> 
</tr> 
+0

둘 중 하나를 사용하는 것이 단점이라 할지라도 'timediff' 기능은 시작 및 중지 시간 대신에 작업을 주입하는 것으로 제한되어 있기 때문에 응용 프로그램의 다른 곳에서는 사용할 수 없게됩니다. – jnthnjns

+0

옵션 2는 어떤 속성을 diff 할지를 알 수있는 문제를 해결합니다. 만약 당신이 항상 객체를 제출해야한다면, 그렇습니다. 그러나 2 개의 매개 변수가 전달되면 함수를 쉽게 확장하고 동작을 변경할 수 있습니다. 나는'{{}} '안에서 변수 할당을 좋아하지 않는다. 그것은 작동하지만 코드를 읽고 디버그하기가 더 어렵다고 생각합니다. –