我正在开发一个
angularjs应用程序作为我的角色学习的一部分.我有控制器,从那里我打电话给服务层.
leagueManager.service("teamsService",function($http){ var teams = {}; $http.get('data/teams.json').then(function(data) { teams = data; }); this.getTeams = function(){ return teams; };
});
我注意到,由于$http.get.then的异步性质,数据没有立即检索,因此当我从控制器(teamsController)调用getTeams()时,我不会得到“团队”,我会得到没有.
任何想法如何解决这个问题?
二次尝试:
在阅读关于延迟和承诺的角度后,如下面的帖子,我尝试跟随,但仍然没有影响.我的可变团队没有按照我的要求进行填充,之后填充,这在我的用户界面中没有帮助:
我的控制器teamController.js
leagueManager.controller('teamsController',function($scope,$location,teamsService,$routeParams){ //init function to initialize data when controller is called everytime. var init = function(){ $scope.teams = []; var promise = teamsService.getTeams(); promise.then( function(data){ console.log("teams after promise:="+data); $scope.teams = data; },function(reason) { alert('Failed: ' + reason); } ); console.log("teams in the scope:="+$scope.teams); }; init(); });
这里是我的ServiceLayer teamsService.js
leagueManager.service("teamsService",function($http,$q){ this.getTeams = function(){ var deferred = $q.defer(); var url = 'data/teams.json'; $http.get(url).success(function(data,status) { // Some extra manipulation on data if you want... deferred.resolve(data); }).error(function(data,status) { deferred.reject(data); }); return deferred.promise; } });
你能帮助我吗我做错了什么?
这是执行时在浏览器控制台中打印的内容:
teams in the scope:= teamsController.js:27
teams after promise:=[object Object],[object Object],[object Object]
这只是表明我确实得到了json对象,但并不是在我想要的时候.由于某种原因,这种沮丧/承诺的事情没有影响.
请帮助这个新的角质量
是的,您将需要使用承诺界面.因此,您不必返回团队对象,您必须退回承诺:
承诺资源:
> http://egghead.io/lessons/angularjs-promises
> http://docs.angularjs.org/api/ng.$q
在服务中:
leagueManager.service("teamsService",function($http){ var deferred = $q.defer(); $http.get('data/teams.json').then(function(data) { deferred.resolve(data); }); this.getTeams = function(){ return deferred.promise; }; });
然后在控制器中:
$scope.team = {}; var promise = teamsService.getTeams(); promise.then(function(data) { $scope.teams = data; });