0

를 재사용 각도 :나는이 같은 컨트롤러가 사용자 정의로 컨트롤러 기능을 해 orderBy 기능

var moduleFichiersDupliques = angular.module('fichiersDupliques', []); 

moduleFichiersDupliques.controller("FichiersDupliquesController", [ '$http', '$log', function($http, $log) { 

    var store = this; 

    $http.get('groupes-dupliques-data.json').success(function(data) { 
     store.groupesDupliquesData = data; 
    }); 

    this.getNombreFichiersDansGroupe = function(groupe) { 
     return groupe.fichiers.length; 
    }; 

    this.getTailleFichier = function(groupe) { 
     return groupe.tailleTotale/this.getNombreFichiersDansGroupe(groupe); 
    }; 

    this.getTailleGaspillee = function(groupe) { 
     var tailleGaspillee = groupe.tailleTotale - this.getTailleFichier(groupe); 
     return tailleGaspillee; 
    }; 
}]); 

내 HTML 코드

<td ng-repeat="groupe in fichiersDupliquesCtrl.groupesDupliquesData | orderBy:fichiersDupliquesCtrl.getTailleGaspillee:true"> 
{{fichiersDupliquesCtrl.getTailleGaspillee(groupe)}} 
</td> 

에서 NG 반복을 그리고 난이 오류 :

TypeError: Cannot read property 'getTailleFichier' of undefined 
at getTailleGaspillee (/test/js/fichiersdupliques.js:26:58) 
at Array.<anonymous> (/test/js/angular-1.3.0.js:17321:24) 
at comparator (/test/js/angular-1.3.0.js:17330:36) 
at /test/js/angular-1.3.0.js:17337:34 
at Array.sort (native) 
at /test/js/angular-1.3.0.js:17326:22 
at $parseFilter (/test/js/angular-1.3.0.js:11939:19) 
at Object.interceptedExpression (/test/js/angular-1.3.0.js:12579:21) 
at Scope.$digest (/test/js/angular-1.3.0.js:13957:40) 
at Scope.$apply (/test/js/angular-1.3.0.js:14227:24) 

이 함수를 사용자 정의 orderBy 함수와 HTML 페이지에서 모두 사용할 수 있도록 내 코드를 리팩터링 할 수 있습니까?

+0

코드를 스캔은'{{fichiersDupliquesCtrl.getTailleGaspillee (Groupe의)}}'해야'{{groupe.getTailleGaspillee (Groupe의)}}' – JimmyRare

답변

0

$scope을 사용하려고합니다.

은 교체 :

<td ng-repeat="groupe in fichiersDupliquesCtrl.groupesDupliquesData | orderBy:fichiersDupliquesCtrl.getTailleGaspillee:true"> 
    {{fichiersDupliquesCtrl.getTailleGaspillee(groupe)}} 
</td> 

으로 :

<td ng-repeat="groupe in groupesDupliquesData | orderBy:getTailleGaspillee:true"> 
    {{getTailleGaspillee(groupe)}} 
</td> 

그런 다음 컨트롤러 :

moduleFichiersDupliques.controller("FichiersDupliquesController", ['$scope', '$http', '$log', function($scope, $http, $log) { 
    $scope.getNombreFichiersDansGroupe = function(groupe) { 
     return groupe.fichiers.length; 
    }; 
    $scope.getTailleFichier = function(groupe) { 
     return groupe.tailleTotale/$scope.getNombreFichiersDansGroupe(groupe); 
    }; 
    $scope.getTailleGaspillee = function(groupe) { 
     var tailleGaspillee = groupe.tailleTotale - $scope.getTailleFichier(groupe); 
     return tailleGaspillee; 
    }; 
}]); 

이 방법, 당신은 어디서나 당신의 HTML에서 fichiersDupliquesCtrl을 지정할 필요가 없습니다, 만큼 html은 fichiersDupliquesCtrl의 범위에 있습니다.
(의미는 <div ng-controller="FichiersDupliquesController">에서)

+0

이 솔루션이하는 일처럼 보인다. 하지만 "$ 범위"코딩 방법 대신 컨트롤러를 코딩하는 "방법"을 유지하는 방법이 있습니까? 나는 "이"방법이 더 좋았던 것을 이해했다. http://stackoverflow.com/questions/11605917/this-vs-scope-in-angularjs-controllers – Dominique

+0

@Dom : 좋아! 이 경우 [이 대답 수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) ;-)을 고려하십시오. – Cerbrus