我正在尝试创建一个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;
})}]);
答案 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处更改:
$scope.data = dataService;
,因为它没有意义,我认为$scope.data
应该是服务返回的数据。$scope.data = dataService.data;
,正如我在第一点所述。您可以从控制台查看结果。在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");
});