2014-10-29 2 views
0

입니다. AngularJS를 처음 사용합니다. 나는 일하는 $ http를 얻는 것처럼 보일 수 없다.

app.factory('employeeFactory', function ($http) { 
    var factory = {}; 

    // get data form controller 
    var employees = []; 
    var Url = "../../../Employee/GetEmployees"; 

    // this does not work ---------------------------- 
    $http.get(Url, { params: { term: 'Step' }}). 
     success(function (response, status, headers, config) { 
      employees = response.data 
     }). 
     error(function (response, status, headers, config) { 
      alert(error); 
     }); 

    // this works using JQuery ajax ---------------------------- 
    $.ajax({ 
     url: Url, 
     data: { term: 'Step' }, 
     dataType: "json", 
     type: "GET", 
     error: function (request, status, error) { 
      alert(error); 
     }, 
     success: function (response) { 
      $.each(response.data, function (i, obj) { 
       employees.push({ EmployeeName: obj.EmployeeName, EmployeeNumber: obj.EmployeeNumber }); 
      }); 
     } 
    }); 

    factory.getEmployees = function() { 
     return employees 
    }; 

    return factory; 
}); 

그리고 다음 컨트롤러 : 나는 다음과 같은 공장

app.controller('EmployeeController', function ($scope, employeeFactory) { 
    $scope.employees = []; 
    init(); 
    function init() { 
     $scope.employees = employeeFactory.getEmployees(); 
    } 
}); 

아약스 공장 작품에서 호출하지만 $ HTTPS는 (모두 공장에, 난 그냥 주석하지 않습니다 테스트하는 동안 하나 또는 다른). 나는 구글 크롬 개발 도구에 보니 모두 호출은 동일한 형식으로 데이터를 반환하지만 $의 HTTP 데이터는 HTML에 바인딩되지 않는 :

: 여기
<div class="container"> 
    <h4>This is view 1</h4> 
    Type a name to filter: <input type="text" data-ng-model="employeeSearch" /> 
    <ul> 
     <li data-ng-repeat="employee in employees | filter:employeeSearch | orderBy:'EmployeeName'">{{ employee.EmployeeName }} - {{ employee.EmployeeNumber }}</li> 
    </ul> 
</div> 

의 형식은 모두 통화에 대한 공장 출하시 반환
{data: [{EmployeeNumber:123456, EmployeeName:Johnson,Bob},…] 
data: [{EmployeeNumber:123456, EmployeeName:Johnson,Bob},…] 
    0: {EmployeeNumber:123456, EmployeeName:Johnson,Bob} 
     EmployeeName: "Johnson,Bob" 
     EmployeeNumber: "123456" 

양쪽 호출이 동일한 형식의보기로 데이터를 반환 할 때 왜 바인딩이 $ http 메서드로 발생하지 않는지 이해할 수 없습니다. 어떤 도움을

+0

당신이 AJAX 호출하면'getEmployees' 전에 완료 보장 할 수 있습니다 :

그래서 각 $의 HTTP 기능의 작동을 얻기 위해, 당신은 당신의 성공 처리기에서 다음을 수행해야합니까? 왜 둘 사이의 차이가 나는지 확신 할 수 없지만, 직원 클래스에 데이터가 먼저 읽혀 지는지 확인할 수있는 것은 없습니다. – Rup

답변

4

JQuery와 아약스가 작동합니다.
각도 아약스 성공 처리기에서 변수를 덮어 쓰지 만 반환 값은 여전히 ​​빈 참조입니다.

angular.forEach(response.data, function(value) { 
    employees.push(value); 
}); 
+0

그게 다야! 데이터를 밀어 넣어야합니까? 나는 거기에 밀어 넣기를 사용하는 많은 예를 보지 못한다. 그래서 내가이 잘못을 저지르고 있는지 궁금해하고있다. 아약스 호출의 밀어 넣기는 내가 발견 한 예제이기 때문에 거기에만있었습니다. Btw, 덕분에 – steveareeno

+0

@ friedi 나는 정확하다고 생각합니다. 그것의 참조 문제, 당신은 할당되기 전에 빈 배열을 검색하고 있습니다. 이 * forEach * 루프가 이것이 최선의 방법이라고 생각하지 않는다는 것을 교정하는 동안. '$ http' 호출에 의해 반환 된 약속을 이용하려면 서비스를 리팩토링해야합니다. 약속을 되 돌린 다음 성공 호출 내에서 데이터를 반환해야합니다. –

+0

그래, 최선의 방법은 아니고 나는 @ m.e.conroy가 제안한 방식으로 할 것이다. – friedi

0

사용이 코드를 감사 :

서비스 :

app.factory('employeeFactory', function ($http) { 
    var employees = []; 
    var Url = "../../../Employee/GetEmployees"; 
    var factory = { 
    getEmp:function(){ 
     return $http.get(Url, { params: { term: 'Step' }}) 
    } 
    } 
    return factory; 
}); 

컨트롤러 : 반환 된 기준에 밀어 때문에

app.controller('EmployeeController', function ($scope, employeeFactory) { 
    $scope.employees = []; 

    function init() { 
     employeeFactory.getEmp().then(function(data){ 
     $scope.employees=data; 
     }) 
     .catch(function(err){ 
     console.log(err); 
     }) 
    } 
    init(); 
}); 
+0

이 방법이 더 좋지만 컨트롤러가 아닌 서비스에서 * success * 및 * error * chained 함수를 수행 할 수 있습니다. 컨트롤러는 데이터를 원한다는 약속만을 알 필요는 없습니다. –

+0

나는 이것을 시도했다. 그러나 그것은 4 개의 li와 대시가있는 각각의 ul을 반환하지만 데이터는 없다. – steveareeno

관련 문제