【问题标题】:AngularJS Ng-Repeat not iterating items in $ScopeAngularJS Ng-Repeat 不迭代 $Scope 中的项目
【发布时间】:2015-02-01 10:22:13
【问题描述】:

我目前正在尝试从我的员工 API 中读取一个 Json 对象数组,它返回以下内容,

 [
            {
                "Id": "00162c3a-2b70-4f50-80e8-6fee463cffdb",
                "EmployeeNumber": 123,
                "FirstName": "John",
                "Surname": "Smith",
                "JobTitle": "Developer",
                "Email": "jsmith@company.co.uk",
                "PhoneNumber": "89345 242397",
                "ExtensionNumber": "2895",
                "MobileNumber": "12343451234"
            },
            {
                "Id": "048b73e7-a84d-439b-97c2-0c611a076eb0",
                "EmployeeNumber": 125,
                "FirstName": "Billy",
                "Surname": "Smith",
                "JobTitle": "Developer",
                "Email": "bsmith@company.co.uk",
                "PhoneNumber": "89345 242397",
                "ExtensionNumber": "2896",
                "MobileNumber": "12343451223"
            }
 ]

在我的 AngularJs 应用程序中,我有一个控制器,如下所示,

'use strict';
app.controller('directoryController', ['$scope', 'Page', function ($scope, Page) {
    Page.setTitle('Employee Directory');

    $.ajax({
        url: 'http://localhost:8080/SGIntranetService/api/employee/',
        type: 'GET',
    }).success(function (data) {
        $scope.employees = data;

    //console.log($scope.employees);
    });
}]);

返回到控制台时,所有对象似乎都在那里。还要注意,由于某种原因,目前我的 Ajax 调用正在向 Web API 发出两个请求。 (不知道为什么)

最后我尝试在部分视图(ng-view)中使用它,只使用其中一个属性进行测试,直到它开始工作,然后将其余的添加进去。

<div class="container" ng-controller="directoryController">
<div ng-repeat="employee in employees">
    <h3>{{employee.FirstName}}</h3>
</div>

在我的 index.html(母版页)上,我有以下内容。

<div class="site-content">
    <div class="content-header">
        <div class="container" ng-controller="pageController">
            <h1 class="page-title">{{Page.title()}}</h1>
        </div>
    </div>
    <div class="container">
        <div data-ng-view="">

        </div>
    </div>
</div>

【问题讨论】:

  • 出于好奇,您为什么使用 jQuery ajax 调用而不是 Angular 的?
  • 我是 AngularJs 的新手,不知道这是可用的。不过我会看看它:)

标签: javascript html json angularjs angularjs-ng-repeat


【解决方案1】:

使用 $http 进行任何类型的 ajax 调用。

$http({
   url: "http://localhost:8080/SGIntranetService/api/employee/", 
   method: "GET"
}).success(function (data) {
    $scope.employees = data;

//console.log($scope.employees);
});;

【讨论】:

    【解决方案2】:

    由于您正在执行 jQuery AJAX 调用,因此 Angular 不知道它,因此当/如果有其他事情强制执行摘要循环时,范围更新将发生。你不想这样。

    最简单的解决方法是使用 Angular 的 $http 服务进行 AJAX 调用:

    $http.get("http://localhost:8080/SGIntranetService/api/employee/")
         .success(function (data) {
             $scope.employees = data;
         }
    

    别忘了将 $http 服务注入到控制器中:

    app.controller('directoryController', 
                  ['$scope', 'Page', '$http', function ($scope, Page, $http) {
    

    快速修复

    如果您仍然希望继续使用 jQuery(无论出于何种原因),您可以使用 $apply() 强制作用域摘要:

    $.ajax({
            url: 'http://localhost:8080/SGIntranetService/api/employee/',
            type: 'GET',
        }).success(function (data) {
            $scope.employees = data;
            $scope.$apply();
        })
    

    【讨论】:

      【解决方案3】:

      你确实调用了控制器,所以你可能两次插入控制器,所以有两个 ajax 调用。 查看 here 来比较 ajax 和 http 调用。 当使用 $http 而不是 ajax 时,你可以像这样重写你的代码:

      app.controller('directoryController', ['$scope', 'Page','$http', function ($scope, Page,$http) {
          Page.setTitle('Employee Directory');
      
      $http({
          url: 'http://localhost:8080/SGIntranetService/api/employee/',
          method: 'GET',
      }).success(function (data) {
          $scope.employees = data;
      });
      }]);
      

      您可以同时使用 ajax 和 $http 调用。 $http 的优点是:

      • 编写 $http 调用很简单 - 您不必精确的标头 并且 javascript 对象会自动转换为 JSON
      • $http有成功方法和错误方法
      • $http 可以与 $httpbackend 服务一起使用,以模拟调用以进行测试。我没有检查 $.ajax 是否适用于此,但我看到here,人们正在询问这个问题。
      • $http 作为 promise 返回结果,所以你可以在 你的 Angular 应用。

      ajax 调用有一个优点,您可以在此调用中设置 async: true 而 $http 不提供此功能。

      一般来说,在使用 Angularjs 时,最好从 JQuery Ajax 迁移到 Angulars $http。但是,如果您想要更深入的调用(例如使用 REST),请使用 $resource 服务。

      这是$http 文档。

      【讨论】:

      • 太好了,直接解决了我的问题。非常感谢 :) 在我的案例中也被标记为最佳答案
      【解决方案4】:

      您正在操作 angular 范围之外的范围。

      要解决您的问题,使用 $apply 可能不是一个好选择。

      改为使用 $resource :

       'use strict';
       app.controller('directoryController', ['$scope', '$resource', 'Page', function ($scope, '$resource', Page) {
         Page.setTitle('Employee Directory');
      
         $resource('http://localhost:8080/SGIntranetService/api/employee/')
            .query()
            .then(function (data) {
                $scope.employees = data;
         });
      }]);
      

      【讨论】:

      • 我认为您在此处缺少$promise,但实际上并不需要在这里首先使用承诺。
      • @JLRishe 在哪里以及为什么?
      • 其中:在.query().then 之间。为什么:因为您可以将$resource.query() 的返回值分配给$scope.employees,它会延迟加载。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多