0

$http在应该从我的服务器获取数据的服务中进行调用。出于某种原因,我无法让我的服务正常工作 - 没有任何反应。我知道服务器代码有效,因为如果我将$http调用放在控制器内的函数中,那么它会按预期获取服务器数据。这是我到目前为止的代码:

app.service('myService', function($q,$compile,$http) {
    this.getData = function() {
        var deferred = $q.defer();
        var promise = $http.get('myfile.php').success(function (data) {
            var response = $compile(data)($scope);
            deferred.resolve(response);
        });
        return deferred.promise; 
    };
});

另外,我知道使用此服务的代码有效,因为如果我执行以下操作,

app.service('myService', function() {
    this.getData = function() {
        return 'TEST';
    };
});

然后我会在使用此服务的 div 中看到“TEST”一词。我觉得我很接近,但我缺少一些东西。关于我做错了什么的任何想法?

更新:

controller: function($scope, $http, $rootScope, myService){
    var scope = $rootScope;
    scope.viewMyData = function() {
        var element = myService.getData();
        $('#myDiv').html(element);
    }
}

HTML:

<div ng-click="viewMyData()">Click Here</div>
<div id="myDiv"></div>

如果我剥离代码myService并简单地返回TEST(如上),那么我将看到“TEST”出现在id="myDiv". 但由于某种原因,$http呼叫没有被触发。

4

2 回答 2

6

@tymeJV 是对的,但这是我试图更好地说明这个例子的尝试。 $http返回一个承诺$http接口,允许您在响应返回时链接要执行的回调。因此,在这种情况下,调用myService.getData()不能立即返回结果(它关闭了从服务器获取数据),因此您需要给它一个函数,以便在服务器最终响应时执行。因此,有了 Promise,您只需使用thePromise.then(myCallbackFunc).

服务

app.service('myService', function($q,$compile,$http) {
    this.getData = function() {
        var promise = $http.get('myfile.php');
        promise = promise.then(function (response) {
            return response.data;
        });
        return promise;
    };
});

控制器

controller: function($scope, $rootScope, myService){
    var scope = $rootScope;
    scope.viewMyData = function() {
        myService.getData().then(function(data) {
            $('#myDiv').html(element);
        });
    }
}
于 2013-10-16T08:13:33.680 回答
0

在控制器中使用.then以继续承诺模式:

myService.getData().then(function(data) {
    $('#myDiv').html(data);
});
于 2013-10-16T02:30:01.720 回答