Javascript 角度工厂不传回数据
我试图创建一个角度工厂,这是基于一个多站点课程的示例 通过在Chrome中调试代码,它似乎运行良好。当我调试它时,我可以看到服务获取我的数据并将其放入数组中,但当我查看$scope.data或dataService.data中的控制器时,数组是空的。我没有看到任何javascript错误。我不确定我做错了什么,还有什么建议。我使用的是AngularJSV1.3.15Javascript 角度工厂不传回数据,javascript,angularjs,angularjs-factory,Javascript,Angularjs,Angularjs Factory,我试图创建一个角度工厂,这是基于一个多站点课程的示例 通过在Chrome中调试代码,它似乎运行良好。当我调试它时,我可以看到服务获取我的数据并将其放入数组中,但当我查看$scope.data或dataService.data中的控制器时,数组是空的。我没有看到任何javascript错误。我不确定我做错了什么,还有什么建议。我使用的是AngularJSV1.3.15 module.factory("dataService", function($http,$routeParams,$q) { v
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;
})}]);
在
您有“data:_data”,而数组的名称仅为“data”。将变量的名称更改为匹配,它将工作:
var _data = [];
事实上,您的代码中有一些错误:
- 在您的服务中,您定义
,但返回var data=[]
。因此,您应该将定义更正为数据:\u data,
var\u data=[]
- 您不定义
,但使用\u bling
angular.copy(result.data,\u bling)代码>
$scope.data
:$scope.data=dataService
编辑:
请注意,以下代码中有3处更改:
$scope.data=dataService代码>,因为它没有意义,我认为$scope.data
应该是服务返回的数据
$scope.data=dataService.data代码>,如我在第1点中所述。您可以从控制台看到结果
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...
})}]);
为什么要这样使用$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");
});
因此,当我以这种方式尝试时,在.then语句TypeError:Cannot read property'then'of undefined at new@AndrewCrowder在_getData函数中还有“return deferred.promise;”行吗?从那以后,我仍然有义务回报你的承诺。谢谢,我想我把它拿出来了,不再认为它是必要的了。然而,我想我会放弃整个方法,因为我显然不明白其中的一些东西。我让它工作了,但是我对不相关的JavaScript进行了一点调整,它停止了工作。因为我之前有一个非工厂版本在工作,所以我要回到那个版本。我知道答案的功劳在这里是一件大事,我不知道该怎么办,因为我是放弃解决方案的人,而不是你。我真的很感谢你的时间和你提供的帮助。很抱歉,这些错误是在我把代码放在这里时产生的。不确定这是怎么发生的这是我第一次询问堆栈溢出问题。我已经修复了上面的帖子,但仍然有相同的问题。至于我为什么要这样做。这就是我所遵循的例子。对我来说似乎很奇怪。他说it能够检测数据服务的变化。整个想法是,我可以在这里存储数据的共享副本,并减少到服务器的往返。老实说,我不确定我是否真的喜欢它,我在没有服务的情况下找到了所有这些工作。@AndrewCrowder我已经修改了我的答案,给你一些代码。它应该会起作用。你能试试吗?谢谢,我确实使用了与你类似的代码,但它似乎是间歇性的,它可以工作一段时间,然后在我对java脚本做了一些非常小的调整后就停止了。因为我之前有一个非工厂版本在工作,所以我要回到那个版本。我知道答案的功劳在这里是一件大事,我不知道该怎么办,因为我是放弃解决方案的人,而不是你。“我真的很感谢你的时间和你提供的帮助。”安德鲁克罗德说,为了选票,请放心。如果我能帮助你,我会很高兴的。
dataService
.getData()
.then(function success(result) {
$scope.data = result; //assing retrived data to scope variable
},
function error() {
//Error
alert("could not load data");
});