angularjs $ http.get让json无法在服务层工作

coo*_*ler 12 angularjs angularjs-service angular-http

我正在开发一个angularjs应用程序作为我的angularjs学习的一部分.我有控制器,从那里我打电话给服务层.

leagueManager.service("teamsService", function($http){
    var teams = {};
        $http.get('data/teams.json').then(function(data) {
        teams = data;
    });
    this.getTeams = function(){
        return teams;
    };
Run Code Online (Sandbox Code Playgroud)

});

我注意到由于$ http.get.then的异步性质,数据不会立即被检索,因此当我从控制器(teamsController)调用getTeams()时,我不会得到"团队",我会得到没有.

不知道如何解决这个问题?

第二次尝试: 在阅读下面的帖子建议的关于延迟和角度承诺之后,我尝试了以下但它仍然没有效果.我的变量团队没有按照我想要的方式进行填充,之后填充它们并且在我的UI中没有帮助:

我的控制器 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();
});
Run Code Online (Sandbox Code Playgroud)

这是我的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;
}
});
Run Code Online (Sandbox Code Playgroud)

你或别人可以帮我解决我做错的事吗?这是执行时在浏览器控制台中打印的内容:

范围内的团队:= teamsController.js:27

承诺后的团队:= [object Object],[object Object],[object Object],[object Object],[object Object]

这只是表明我确实得到了json对象但不是我想要的时候.出于某种原因,这种违背/承诺的事情没有任何影响.

请帮助这个新的角窦炎

haj*_*poj 19

是的,你需要使用一个promise接口.因此,不必返回团队对象,而是直接返回一个承诺:

承诺资源:

在服务中:

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;
    };
});
Run Code Online (Sandbox Code Playgroud)

然后在控制器中:

$scope.team = {};

var promise = teamsService.getTeams();
promise.then(function(data) {
    $scope.teams = data;
});
Run Code Online (Sandbox Code Playgroud)

  • @cooler如果数据正确返回,但没有显示它听起来像是一个数据绑定问题.也许检查你的HTML以确保标记是正确的并且对应于你的javascript数据结构.可以肯定的是,您的数据是一个正确的json对象吗? (2认同)