2014-03-26 5 views
3

데이터베이스에있는 모든 사람들의 정보를 저장하는 json 파일이 있습니다. 사실 웹 페이지의 이름과 성을 표시하는 데 사용하고 모든 사람의 세부 정보를 표시 할 가능성을 추가하고 싶습니다. AngularJS : ID가있는 json 배열에서 데이터 가져 오기

그래서 나는이 같은 사람의 ID를 사용하고 수행합니다

.when('/people/:id', {templateUrl: 'partials/people-detail.html'}) 

그것은 꽤 잘 작동, 내가 좋은 모든 사람을 위해 생성 된 페이지가 있습니다. 하지만 지금은 그 사람의 정보를 되찾고 싶습니다.

가장 쉬운 방법은 모든 사람을위한 json 파일을 가지고 있었을 것이지만, 나는 많은 파일을 가지고 있다는 생각을별로 좋아하지 않습니다. 내 생각은 people.json 파일을 반복하여 좋은 파일을 찾고 사용하는 것이지만 작동하지 않습니다. 그것이 작동하지 않기 때문에 어쩌면 내 솔루션이 나쁜, 잘

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

PeopleController.controller('PeopleDetailCtrl', ['$scope', '$routeParams', '$http', 
    function($scope, $routeParams, $http) { 
     $scope.search = function() { 
      var url = 'data/people.json'; 
      $http.get(url).success(httpSuccess).error(function() { 
       alert('Unable to get back informations :('); 
      }); 
     } 
     httpSuccess = function(response) { 
      $scope.persons = response; 
     } 

     function getById(arr, id) { 
      for (var d = 0, len = arr.length; d < len; d += 1) { 
       if (arr[d].id === id) { 
        return arr[d]; 
       } 
      } 
     } 
     $scope.search(); 
     $scope.person = getById($scope.persons,$routeParams.id); 
    }]); 

,하지만 난 그렇게 할 다른 방법을 찾을 수 없습니다 :

여기 내 컨트롤러입니다.

지금은 모두 당신입니다. :)

감사합니다.

답변

4

$scope.search 메서드에 비동기 인 $http.get()이 포함되어있는 것이 문제입니다.

그 다음 줄 ($scope.person을 설정하는 것)은 을 실행하고 전에 json 파일을 읽었 음을 의미합니다. 따라서 $scope.persons은 실행될 때 비어 있습니다.

$http.get()이 체인을 promise으로 반환한다는 점을 활용할 수 있습니다.

그래서 당신은 그 약속을 반환하기 위해 search() 기능을 변경하면 모든 것이 성공했을 때, 당신은 다음 person를 채우는 데 then()를 사용할 수 있습니다

$scope.search = function() { 
    var url = 'data/people.json'; 

    return $http.get(url).success(httpSuccess).error(function() { 
    alert('Unable to get back informations :('); 
    }); 

} 

합니다 (return 문을 참고).

는이 활용하는 사람이 인구 변화 : 나는 사람을 얻는 희망

$scope.search().then(function(){ 
    $scope.person = getById($scope.persons,$routeParams.id); 
}); 
+0

덕분에, 작동! 가장 좋은 해결책인지는 모르겠지만 (매번 1000 번 반복해야한다면 정말 멋지다 ^^) 그래도 작동합니다. 글쎄, 나는 then() 메서드의 유틸리티를 정말로 이해하지 못한다. 유일한 차이점은 약속을 기다리는 것입니다. success()가 약속을 반환하는지 확실하지 않더라도이 경우에는 error() 메서드를 사용하여이 문제를 관리 할 수 ​​있습니다. – Ryuu

+0

성공하면 성공으로 약속이 반환됩니다. 더 많은 것을 알고 싶다면 약속을 읽어야합니다. 잘 문서화 된 자바 스크립트 원리입니다. ID로 가져 오기위한 솔루션 : 더 나은 옵션은 json 파일이 아닌 데이터베이스에 정보를 저장 한 다음 서버에 API를 노출하여 해당 데이터베이스를 직접 쿼리하는 것입니다. –

+0

나는 그것을 찾을 것이다, 고마워. 데이터베이스와 서버를 사용하는 것이 첫 번째 아이디어 였지만 응용 프로그램은 오프라인으로 작동해야하기 때문에 (코드바가있는 모바일 응용 프로그램) 모든 항목을 로컬에 저장하고 서버에 요청하여 파일을 업데이트 할 수있는 가능성을 추가합니다. – Ryuu

0

하는 클릭에 같은 완전히 다른 이벤트입니다. 모든 사람이 사용할 수 그렇지 않으면이 논리는 HTTP 호출에 대한 성공 콜백의 일부 내부 이동이있는 가정

$scope.person = function(_id) { 
    return $.grep($scope.persons, function(item){ 
     return item.id == _id 
    })[0]; 
} 

: 당신은 GREP을 시도 할 수 있습니다.

+0

도움 주셔서 감사하지만 jquery를 사용하지 않습니다. – Ryuu

0

저는 ECMAScript 5 filter을 사용하여 id로 사람을 얻었습니다. 그리고 id에 의한 검색을 성공 방법으로 옮겼습니다. 왜냐하면 우리는 ajax 호출을 다루고 있기 때문입니다.

예 :

app.controller('PeopleDetailCtrl', ['$scope', '$routeParams', '$http', 
    function($scope, $routeParams, $http) { 
     $scope.search = function() { 
      var url = 'data.json'; 
      $http.get(url).success(httpSuccess).error(function() { 
       alert('Unable to get back informations :('); 
      }); 
     } 
     httpSuccess = function(response) { 
      $scope.persons = angular.fromJson(response); 

      $scope.person = $scope.persons.filter(function(item){ 
      return item.id==routeParams.id //check for undefined; 
      }); 
     } 


     $scope.search(); 

    }]); 

라이브 예 : 당신의 도움에 대한 http://plnkr.co/edit/jPT6aC5UqLdHGJ1Clfkg?p=preview

+0

나는 이드의 검색을 별도로 유지하고 내 대답과 마찬가지로 약속을 되 찾는 것이 더 낫다고 주장 할 것이다. 따라서 동일한 데이터 검색 기능을 사용하여 다른 작업을 수행하거나 데이터 검색을 서비스로 마이그레이션하는 것이 더 쉽습니다. –

+0

필터가 배열을 만듭니다. – Chookoos

관련 문제