AngularJS Ng-Repeat不迭代$ Scope中的项目

时间:2015-01-27 10:38:59

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

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

 [
            {
                "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>

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

由于您正在进行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) {

的QuickFix

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

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

答案 2 :(得分:0)

您正在操纵范围超出角度范围。

要解决您的问题,使用$ 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;
   });
}]);

答案 3 :(得分:0)

你打电话给控制器,所以也许你两次插入控制器,所以有两个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返回,因此您可以使用此机制 你的角度应用程序。

ajax调用有一个专业人员,您可以在此调用中设置async:true,$ http不提供此功能。

通常,在使用Angularjs时,最好从JQuery Ajax迁移到Angulars $ http。但是如果你想要更深入的调用(比如使用REST),请使用$resource服务。

以下是$http文档。