Javascript AngularJS$http get不';不起作用,但$.ajax起作用

Javascript AngularJS$http get不';不起作用,但$.ajax起作用,javascript,jquery,ajax,angularjs,get,Javascript,Jquery,Ajax,Angularjs,Get,我对AngularJS是新手。我似乎无法让$http工作。我有以下工厂: app.factory('employeeFactory', function ($http) { var factory = {}; // get data form controller var employees = []; var Url = "../../../Employee/GetEmployees"; // this does not work ---------

我对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();
    }
});
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();
});
工厂中的ajax调用可以工作,但是$https不能(两者都在工厂中,我只是在测试时注释掉其中一个)。我查看了google chrome开发工具,两个调用都以相同的格式返回数据,但$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>
我不明白为什么当两个调用都以相同的格式将数据返回到视图时,$http方法没有绑定。感谢您的帮助使用以下代码:

服务:

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 = [];
    init();
    function init() {
        $scope.employees = employeeFactory.getEmployees();
    }
});
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();
});
使用此代码:

服务:

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 = [];
    init();
    function init() {
        $scope.employees = employeeFactory.getEmployees();
    }
});
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();
});

jQuery ajax之所以有效,是因为您推送到了返回的引用。
在angular ajax成功处理程序中,覆盖变量,但返回值仍然是空引用

因此,要使angular$http函数正常工作,您应该在成功处理程序中执行以下操作:

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

jQuery ajax之所以有效,是因为您推送到了返回的引用。
在angular ajax成功处理程序中,覆盖变量,但返回值仍然是空引用

因此,要使angular$http函数正常工作,您应该在成功处理程序中执行以下操作:

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

您能保证AJAX调用在您
getEmployees
之前已经完成吗?我不确定这两者之间为什么会有所不同,但据我所知,employees类中没有任何东西可以保证数据已被首先读取。您能保证AJAX调用在您
getEmployees
之前已完成吗?我不知道为什么这两个不同,但据我所知,在你的employees类中没有任何东西可以保证数据已经被首先读取。就是这样!我需要推送数据吗?我没有看到太多使用push的例子,所以我想知道我是不是搞错了。ajax调用中的推送只是因为我发现了这个例子。顺便说一句,谢谢ton@friedi我认为这是正确的。这是一个引用问题,您要在分配空数组之前检索它。虽然这个forEach循环可以纠正我认为这不是最好的方法。您需要重构服务,以利用
$http
调用返回的承诺。你应该回复承诺,然后在成功电话中回复数据。是的,这不是最好的方式,我会按照@m.e.conroy建议的方式来做。我必须考虑m.e.conroy的建议。再次感谢你们,就这样!我需要推送数据吗?我没有看到太多使用push的例子,所以我想知道我是不是搞错了。ajax调用中的推送只是因为我发现了这个例子。顺便说一句,谢谢ton@friedi我认为这是正确的。这是一个引用问题,您要在分配空数组之前检索它。虽然这个forEach循环可以纠正我认为这不是最好的方法。您需要重构服务,以利用
$http
调用返回的承诺。你应该回复承诺,然后在成功电话中回复数据。是的,这不是最好的方式,我会按照@m.e.conroy建议的方式来做。我必须考虑m.e.conroy的建议。再次感谢你们两位。这更好,但你们可以在服务中而不是控制器中执行成功和错误链接功能。控制器不必知道,它只是承诺它需要数据。我尝试了这一点,但它返回一个ul,每个ul后面有四(4)个li和一个破折号,但没有数据。这更好,但您可以在服务中而不是控制器中执行成功和错误链接功能。控制器不必知道它只是承诺它需要数据。我尝试了这个,但它返回一个ul,每个ul后面有四(4)个li和一个破折号,但没有数据