2014-10-10 3 views
0

내가 처음으로 각도 응용 프로그램을 구축하기 위해 노력하고있어 이상 반복을 통해 값이에 문제를 갖는

(function() { 

var ItemController = function($scope, $routeParams, $log, foodFactory) { 
    var foodId = $routeParams.foodId; 
    $scope.food = []; 
    $scope.item; 

    function init() { 
     foodFactory.getFoods() 
      .success(function(foods) { 
       $scope.food = foods; 
      }) 
      .error(function(data, status, headers, config) { 
       //handle error 
      }); 
    } 

    init(); 

    for (var i = 0, len = $scope.food.length; i < len; i++) { 
     if (foodId == $scope.food[i].id) { 
      $scope.item = $scope.food[i]; 
     } 
    } 

}; 
angular.module('paleoApp') 
    .controller('ItemController', ['$scope', '$routeParams', '$log', 'foodFactory', ItemController]); 

})(); 

코드는 제대로 개체의 배열에 $ scope.food을 설정 foodFactory에 의해 JSON 파일에서 가져 왔으며 {{food}}를 사용할 때보기에도 배열이 제대로 표시됩니다. 배열 내에서 적절한 객체를 얻기 위해 $ scope.food를 반복하여 foodId와 일치하는 'id'속성을 가진 객체를 찾아 $ scope.item에 객체를 할당하려고했습니다. 그러나보기에는 {{item}}에 대한 내용이 표시되지 않습니다.

내가 뭘 잘못하고 있니?

감사합니다.

답변

2

init 메서드에서 getFoods() 호출은 비동기로 표시되지만 호출 완료 전에 $scope.food을 반복합니다. 다음과 같은 일을 할 수 있어야한다 :

var ItemController = function($scope, $routeParams, $log, foodFactory) { 
    var foodId = $routeParams.foodId; 
    $scope.food = []; 
    $scope.item; 

    function init() { 
     return foodFactory.getFoods() 
      .success(function(foods) { 
       $scope.food = foods; 
      }) 
      .error(function(data, status, headers, config) { 
       //handle error 
      }); 
    } 

    init().then(function() { 
     for (var i = 0, len = $scope.food.length; i < len; i++) { 
      if (foodId == $scope.food[i].id) { 
       $scope.item = $scope.food[i]; 
      } 
     } 
    }); 
}; 

은 당신이 여기에있는 것은 init 메소드는 약속을 반환합니다. init().then에 전화 할 때 목록에있는 음식 항목을 찾기 전에 $scope.food = foods; 명이 실행될 때까지 기다립니다.

+0

감사합니다. 나 한테 의미가있어. 불행히도, 그런 식으로 .then()을 사용하는 것을 허용하지 않습니다. 내가 원하는 결과를 얻은 $ timeout을 사용하여 작은 해결 방법을 만들었지 만 값이 싼 해킹처럼 느껴졌고 올바르게 수행하는 방법을 찾고 싶습니다. – jfsk22

+0

저는 Angular의 $ http 서비스를 사용하여 JSON 파일을 가져 오는 것으로 가정합니다. init() 메소드를 변경하여 약속을 되돌려 놓았습니다 (이전에 그렇게하지 않았 음). [$ http] (https://docs.angularjs.org/api/ng/service/$http) 호출은 성공/오류 메서드로 약속을 반환합니다. 성공/오류 메서드는 모두 자신의 약속을 반환합니다. 체인 연결 용. 이 방법으로 .error를 호출하여 약속을 되돌릴 수 있으며 위의 예와 같이 연결할 수 있습니다. – wjohnsto