【问题标题】:AngularJS $http get doesn't work but $.ajax doesAngularJS $http get 不起作用,但 $.ajax 起作用
【发布时间】:2014-10-29 13:36:08
【问题描述】:

我是 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();
    }
});

工厂中的 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>

这是工厂为两个调用返回的格式:

{data: [{EmployeeNumber:123456, EmployeeName:Johnson,Bob},…]
data: [{EmployeeNumber:123456, EmployeeName:Johnson,Bob},…]
    0: {EmployeeNumber:123456, EmployeeName:Johnson,Bob}
        EmployeeName: "Johnson,Bob"
        EmployeeNumber: "123456"

我不明白为什么,当两个调用都以相同的格式将数据返回到视图时,$http 方法没有发生绑定。任何帮助表示赞赏

【问题讨论】:

  • 你能保证AJAX调用在你getEmployees之前已经完成了吗?我不确定为什么两者之间会有所不同,但据我所知,您的员工类中没有任何内容可以保证首先读取数据。

标签: javascript jquery ajax angularjs get


【解决方案1】:

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

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

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

【讨论】:

  • 就是这样!我应该推送数据吗?我没有看到很多使用 push 的例子,所以我想知道我是否正在处理这个错误。 ajax 调用中的推送只是在那里,因为那是我找到的示例。顺便说一句,非常感谢
  • @friedi 我认为是正确的。它是一个参考问题,您要在分配空数组之前检索它。虽然这个 forEach 循环会纠正我认为这不是最好的方法。您需要重构您的服务以利用 $http 调用返回的承诺。您应该返回承诺,然后在成功调用中返回数据。
  • 是的,这不是最好的方法,我会按照@m.e.conroy 建议的方式来做
  • 我将不得不考虑 m.e.conroy 的建议。再次感谢你们。
【解决方案2】:

使用此代码:

服务:

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();
});

【讨论】:

  • 这更好,但您可以在服务而不是控制器中执行 successerror 链接函数。控制器不应该只知道它需要数据的承诺。
  • 我试过这个,但它返回一个带有四 (4) 个 li 和一个破折号的 ul,但没有数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多