没有从$ http从服务到范围获取数据

时间:2014-12-21 10:26:39

标签: javascript angularjs

我们正在尝试从服务agrService获取数据$http,但是当我向控制器提交数据时,我无法在该功能之外访问它

$scope.resource在函数内部返回数据,但不在外面请求帮助。

var app = angular.module('app', ['ui.router','ngTasty']);
app.config(['$urlRouterProvider', '$stateProvider',function($urlRouterProvider, $stateProvider, $routeProvider, $locationProvider) {
    $urlRouterProvider.otherwise('/');
    $stateProvider
        .state('home', {
            url: '/',
            templateUrl: 'templates/home.html',
            controller: function($scope, $http, $location, agrService) {
                agrService.bannerSlides().then(function(data) {
                    //its working here                       
                   $scope.resource = data;
                }, function(error) {
                    // do something else
                });

我需要在这里获得数据才能获得任何身体帮助

               console.log($scope.resource);
            }
        });
}]);
app.service('agrService', function($q, $http) {this.bannerSlides = function() {
        var dataUrl = 'http://WWW.EXP.COM/codeIgniter_ver/main/home';
        var ret = $q.defer();
        $http({
                method: 'GET',
                dataType: "json",
                url: dataUrl
            })
            .success(function(data, status, headers, config) {
                ret.resolve(data);
            }).error(function(data, status, headers, config) {
                ret.reject("Niente, Nada, Caput");
            });
        return ret.promise;
    };
});

2 个答案:

答案 0 :(得分:0)

我的建议是重新考虑一下逻辑。您希望在收到数据后对数据执行某些操作,那么为什么不在收到数据后创建一个函数?

答案 1 :(得分:0)

您永远无法访问该控制台日志中的资源数据,因为$ http是异步调用,无论您是否返回承诺,它都没有准备好那一点。

但是,如果您在模板或使用角度双重绑定的其他地方使用它,它将正常工作。

要解决您的问题,您可以使用该服务调用之后的内容定义一个函数,并从成功回调中调用它:

agrService.bannerSlides().then(function(data) {
                //its working here                       
               $scope.resource = data;
               myAfterFunction();   // <--- here
            }, function(error) {
                // do something else
            });

,功能可以是:

function myAfterFunction() {
    console.log($scope.resource);
}

顺便说一下。您的服务是deferred antipattern的一个示例,您可以这样做:

app.service('agrService', function($q, $http) {this.bannerSlides = function() {
        var dataUrl = 'http://WWW.EXP.COM/codeIgniter_ver/main/home';
        return $http({
                method: 'GET',
                dataType: "json",
                url: dataUrl
            })
    };
});