2017-03-17 6 views
0

(이 부분 작동) 중복 된 결과없이 각 부서에 따라 총계를 합산하려고합니다. 선택한 결과에 따라 모든 결과가 표시됩니다.날짜에 따라 합계가 표시됩니다.

md-datepicker로 날짜를 선택하고 date = choosed date 인 총 작업 시간 만 표시하려고합니다.

가 HTML의 일부입니다

<body ng-app="ngrepeatSelect"> 
    <div ng-controller="ExampleController"> 
     <form name="myForm"> 
      <md-datepicker ng-model="myDate" md-placeholder="Enter date" ng-change="sum(myDate)"></md-datepicker> 
      {{myDate}} 
      <tt>model = {{data.model}}</tt> 
      <br/> 
      <hr/> 
     </form> 
     <md-table-container> 
      <table md-table> 
       <thead md-head> 
        <tr md-row> 
         <th md-column>Dept</th> 
         <th md-column>Total time</th> 
         <th md-column></th> 
        </tr> 
       </thead> 
       <tbody md-body> 
        <tr ng-if="!data.model" md-row md-select="test" md-on-select="" md-auto-select ng-repeat="test in tests"> 
         <td md-cell>{{ test.dept }}</td> 
         <td md-cell>{{ test.total }}</td> 
         <td md-cell></td> 
        </tr> 

        <tr ng-if="data.model" md-row md-select="test" md-on-select="" md-auto-select ng-repeat="(key,val) in data.model"> 
         <td md-cell>{{ key }}</td> 
         <td md-cell>{{ val }}</td> 
         <td md-cell></td> 
        </tr> 
       </tbody> 
      </table> 
     </md-table-container> 
    </div> 
</body> 

나는 내가 뭘하려고 오전 보여 jsFiddle을 만든 JS

angular.module('ngrepeatSelect', ['ngMaterial']) 
    .controller('ExampleController', function($scope, $filter) { 
     $scope.myDate = ''; 

     $scope.$watch('myDate', function(newVal, oldVal) { 
      if (!newVal) { 
       return false; 
      } 
      var date = $filter('date')(new Date(newVal), "yyyy-MM-dd"); 
     }); 

     var data = [{ 
      id: "1", 
      user: "John Doe", 
      dept: "test", 
      date: "2017-03-02", 
      task_time: "83" 
     }, { 
      id: "2", 
      user: "Mark Doe", 
      dept: "test", 
      date: "2017-02-02", 
      task_time: "41" 
     }, { 
      id: "3", 
      user: "Zac Doe", 
      dept: "other", 
      date: "2017-02-04", 
      task_time: "12" 
     }, { 
      id: "4", 
      user: "Zac Doe", 
      dept: "test", 
      date: "2017-03-02", 
      task_time: "41" 
     }, { 
      id: "5", 
      user: "Zac Doe", 
      dept: "test", 
      date: "2017-03-02", 
      task_time: "41" 
     },{ 
      id: "6", 
      user: "Zac Doe", 
      dept: "test2", 
      date: "2017-03-02", 
      task_time: "41" 
     },{ 
      id: "7", 
      user: "John Doe", 
      dept: "test", 
      date: "2017-01-02", 
      task_time: "41" 
     },{ 
      id: "8", 
      user: "Zac Doe", 
      dept: "test", 
      date: "2017-01-01", 
      task_time: "41" 
     },{ 
      id: "9", 
      user: "John Doe", 
      dept: "tests", 
      date: "2017-02-12", 
      task_time: "41" 
     }, { 
      id: "10", 
      user: "Zac Doe", 
      dept: "test2", 
      date: "2017-02-13", 
      task_time: "53" 
     }]; 

     var totalPerDept = []; 

     angular.forEach(data, function(item) { 
      var index = findWithAttr(totalPerDept, 'dept', item.dept); 

      if (index < 0) { 
       totalPerDept.push({ 
        dept: item.dept, 
        total: parseFloat(item.task_time) 
       }); 
      } else { 
       totalPerDept[index].total += parseFloat(item.task_time); 
      } 
     }); 
     $scope.tests = totalPerDept; 

     function findWithAttr(array, attr, value) { 
      for (var i = 0; i < array.length; i += 1) { 
       if (array[i][attr] === value) { 
        return i; 
       } 
      } 
      return -1; 
     } 


     $scope.sum = function(date) { 
      let model = data.filter(function(item) { 
       return (item.date == TheSameDate(item)) 
      }); 

      let tests = {}; 
      model.forEach(function(item) { 
       if (!tests.hasOwnProperty(item.dept)) { 
        tests[item.dept] = 0; 
       } 

       tests[item.dept] += parseFloat(item.task_time); 

      }); 

      $scope.data.model = tests; 
     } 

     function TheSameDate(item){ 
      if($scope.myDate){ 
      let myDate = new Date($scope.myDate); 
      let itemDate = new Date(item.date); 

      if(myDate.getFullYear() != itemDate.getFullYear() || myDate.getMonth() != itemDate.getMonth()){ 
       return false; 
      } 
      } 

      return true 
     } 


     $scope.data = { 
       current: null, 
      model: null, 
      availableOptions: [{ 
        id: '1', 
        name: 'John Doe' 
       }, 
       { 
        id: '2', 
        name: 'Mark Doe' 
       }, 
       { 
        id: '3', 
        name: 'Zac Doe' 
       } 
      ] 
     }; 


    }); 

.

+0

날짜 비교에 문제가 있습니다 필터에 두 날짜의 평등을 확인하는 조각 이하로 사용했습니다. 내 [답변] (http://stackoverflow.com/a/42853082/3543808)을 확인 –

답변

0

나는 당신의 코드를 리팩터링하고 날짜를 비교하는 방식을 변경했다.

I 자체가

let model = data.filter(function(item) { 
    let iDate = new Date(item.date); 
    return (
     iDate.getFullYear() === sDate.getFullYear() && 
     iDate.getMonth() === sDate.getMonth() && 
     iDate.getDate() === sDate.getDate() 
    ); 
}); 

데모

fiddle

+0

고마워. 나는이 행을 삭제했다. iDate.getDate() === sDate.getDate() 왜냐하면 나는 3 월이나 1 월에 예를 들어 모든 것을 일없이 보여주고 싶기 때문이다. –

+0

질문이 하나 더 있습니다. 날짜를 현재 날짜로 선택하지 않고 모든 합계를 표시 할 수 있습니까? 항상 현재 날짜 –

+0

에 대한 총계를 표시하십시오. @ NelsonBiggety. 예, 할 수 있습니다. 컨트롤러 대신에 배열을 반복적으로 반복하는 대신 함수를 사용하고 필요한 날짜를 전달하여 주어진 날짜의 합계를 표시 할 수 있습니다. –

관련 문제