Angular Factory不传回数据

时间:2015-05-06 12:54:18

标签: javascript angularjs angularjs-factory

我正在尝试创建一个Angular Factory,这是基于复数网站课程http://www.pluralsight.com/training/player?author=shawn-wildermuth&name=site-building-m7&mode=live&clip=3&course=site-building-bootstrap-angularjs-ef-azure的示例。

通过调试Chrome中的代码,它似乎运行正常。我可以看到,当我调试它时,服务获取我的数据并将其放入我的数组中但是当我在$ scope.data或dataService.data中查看控制器时,数组是空的。我没有看到任何javascript错误。我不确定我做错了什么,有什么建议。我正在使用AngularJS v1.3.15。

module.factory("dataService", function($http,$routeParams,$q) {
var _data = [];

var _getData = function () {
    var deferred = $q.defer();

    $http.get("/api/v1/myAPI?mainType=" + $routeParams.mainType + "&subType=" + $routeParams.subType)
        .then(function (result) {
            angular.copy(result.data,_data);
            deferred.resolve();
        },
        function () {
            //Error
            deferred.reject();
        });
    return deferred.promise;
};

return {
    data: _data,
    getData: _getData
};});

module.controller('dataController', ['$scope', '$http', '$routeParams', 'dataService',function ($scope, $http, $routeParams, dataService) {
$scope.data = dataService;
$scope.dataReturned = true;
$scope.isBusy = true;

dataService.getData().then(function () {
    if (dataService.data == 0)
        $scope.dataReturned = false;
},
function () {
    //Error
    alert("could not load data");
})
.then(function () {
    $scope.isBusy = false;
})}]);

3 个答案:

答案 0 :(得分:0)

L = R * 299/1000 + G * 587/1000 + B * 114/1000

你有“data:_data”,而你的数组只是命名为“data”。更改要匹配的变量名称,它将起作用:

return {
  data: _data,
  getData: _getData
};});

答案 1 :(得分:0)

事实上,您的代码中存在一些错误:

  • 在您的服务中,您定义var data = [];,但返回data: _data,。因此,您应该将定义更正为var _data = []
  • 您没有定义_bling,但您使用angular.copy(result.data,_bling);

还有一个问题,为什么要将服务分配给$scope.data$scope.data = dataService

编辑: 请注意,以下代码中有3处更改:

  1. 评论$scope.data = dataService;,因为它没有意义,我认为$scope.data应该是服务返回的数据。
  2. $scope.data = dataService.data;,正如我在第一点所述。您可以从控制台查看结果。
  3. 在if条件中,我认为您要比较返回的数据数组的长度,而不是数据。

    module.controller('dataController', ['$scope', '$http', '$routeParams', 'dataService',function ($scope, $http, $routeParams, dataService) {
    // $scope.data = dataService;
    $scope.dataReturned = true;
    $scope.isBusy = true;
    
    dataService.getData().then(function () {
        if (dataService.data.length === 0){
            $scope.dataReturned = false;
        }else{
            $scope.data = dataService.data;
            console.log($scope.data);
        }
    },
    // other codes...
    })}]);
    

答案 2 :(得分:0)

为什么你会以这种方式使用$ q延迟?

使用$ q的正确方法:

$http.get("/api/v1/myAPI?mainType=" + $routeParams.mainType + "&subType=" + $routeParams.subType)
    .success(function (result) {
        deferred.resolve(result);
    }).error(
    function () {
        //Error
        deferred.reject();
    });

然后在控制器中

dataService
    .getData()
    .then(function success(result) {
        $scope.data = result; //assing retrived data to scope variable
    },
    function error() {
        //Error
        alert("could not load data");
    });