AngularJS - $ q的Promise没有正确地级联到控制器

时间:2013-11-02 14:27:46

标签: javascript angularjs model-view-controller

当我在AngularJS上阅读Pluralsight的基础知识时,我对$http + $q.defer()无法正常工作感到难过。似乎即使deferred变量已被解析,更改仍然不会级联到控制器上。

我的观点:

 <li class="row" ng-repeat="item in jsonData.Items">

我的服务:

mediaApp.factory('ServiceData', function ($http,$q) {
        return{
            getJson: function ($scope) {
                var deferred = $q.defer();

                $http(
                {
                    method: 'GET',
                    url: url
                }).
                        success(function (data, status, header, config) {


                            $timeout(function () {
                                deferred.resolve(data);
                            });
                        })
        }

我的控制器

$scope.jsonData = ServiceData.getJson($scope);

同时,这些代码行在控制器上运行:

ServiceData.getJson($scope).
       then(function (data) {
           $scope.jsonData = data;
       });

有人可以开导我吗?我相信解决方法已经是正确的,但我想了解为什么代码的某些实现不能按预期工作。

是什么给出了?

1 个答案:

答案 0 :(得分:1)

您没有从getJson

返回承诺
mediaApp.factory('ServiceData', function ($http, $q) {
    return {
        getJson: function ($scope) {
            var deferred = $q.defer();

            $http({
                method: 'GET',
                url: 'json.json'
            }).
            success(function (data, status, header, config) {
                deferred.resolve(data);

            })
            /* return the promise*/
            return deferred.promise
        }
    }
})

由于$http会返回一个承诺....你可以在不创建自己的deffered的情况下做同样的事情而只返回$http调用

DEMO