在AngularJs Service中从WebApi恢复数据的问题

时间:2016-02-18 19:46:20

标签: javascript angularjs asp.net-web-api angularjs-service angular-promise

我将在我的应用程序中使用AngularJS服务并使一切都干净整洁..我为此目的跟踪了一些文章。但它似乎没有完成。对吗? 我没有看到任何错误或什么,但是当我设置Alert(数据)时;我会得到未定义的错误。我错过了什么工作?

我的App.js

var app = angular.module('starter', ['ionic'])

我的服务.js

var serverPath = 'http://url/api/locations';

app.service('testService', function($http) {
  this.getLocations = function() {
    $http.get(serverPath).success(function(data) {
      return data;
    });
  };
});

我的controller.js

app.controller('LocationsController', function ($scope, testService) {
  $scope.locations = testService.getLocations();
});

和我的用户界面

<div ng-controller="LocationsController">
  <ul>
    <li ng-repeat="location in locations">
      {{ location.locationName }}
    </li>
  </ul>
</div>

2 个答案:

答案 0 :(得分:1)

一旦请求数据,就无法直接从异步调用中获取数据。您应该遵循promise模式来处理异步数据。

我想指出你做过的几个错误。

  1. 您应该从服务方法$http.get返回getLocations承诺,以便您可以在该方法上放置.then函数。
  2. 然后在控制器内部控制器调用服务方法getLocations并放置.then函数,当ajax成功时,第一个将调用,第二个将在ajax错误时调用。 .then

    的功能
    this.getLocations = function () {
        return $http.get(serverPath); //return promise object
    };
    
  3. <强>控制器

    testService.getLocations().then(function(response){ //success function
         $scope.locations = response.data;
    }, function(error){ //error function
         console.log("Some error occurred", error)
    });
    

答案 1 :(得分:0)

这是我如何做到这一点,因为$ http在

中有承诺

我想在页面上添加一个初始化步骤。

服务内部:

$http.get(serverPath)
  .success(function(data) {
    return data;
  })
  .error(function(err) {
    console.log("some error occured");
    return err;
  });

控制器:

app.controller('LocationsController', function($scope, testService) {
  $scope.init = function() {
    testService.getLocations()
      .success(function(res) {
        $scope.locations = res;
      })
      .error(function(err) {
        console.log("LocationsController, getLocations error:", err);
        // alert(err);
      });
  };
});

标记:

<div ng-controller="LocationsController" ng-init="init()">
  <ul>
    <li ng-repeat="location in locations">
      {{ location.locationName }}
    </li>
  </ul>
</div>

如果http调用需要一些时间,您还可以添加ng-hide。