AngularJs不想returndefer.promise

AngularJs doesn't want to return defer.promise

这是我的看法(抱歉变量和函数名称太长):

   <tr  ng-repeat="passation in passations " >
<td ng-init=" passation.stats_quota_campagnes = get_stats_quota_campagnes(passation)">{{passation.stats_quota_campagnes}}</div></td>
</tr>

这是我的 angularjs 函数,它应该 return 结果 :

$scope.get_stats_quota_campagnes = function(passation){

     var defer = $q.defer();
    $http.post('backend/backend.php?action=stats_quota_campagnes',{'id_passation':passation.id_passation})
    .success(function(data){ 
        console.log(data);

          defer.resolve(data);

    });
      return defer.promise;
}

console.log(数据);显示这个,'我从 PHP 后端获取正确的数据:

Object { 0: "401", Quota: "401" }

但我已经尝试了很多东西,但完全无法将配额值放入我的视图中! defer.promise 变量总是空的我不明白为什么。请问我能做什么?

在我看来,实际上是这样的:

{}

而不是值,而 console.log 表明它正在工作,正确的变量来自 $http,但视图不会更新。我听说过 $apply(),但不知道如何使用它。

您只能在 then 回调中访问已解决的承诺值:

somePromise.then(function(value) {
    console.log(value)
})

在你的情况下,你可以这样做:

$scope.get_stats_quota_campagnes = function(passation){

    var defer = $q.defer();
    $http.post('backend/backend.php?action=stats_quota_campagnes',{'id_passation':passation.id_passation})
    .success(function(data){ 
        console.log(data);
        $scope.data = data;
    });
}

然后您可以在模板中访问 $scope.data

您无需对您的承诺做任何事情,只需在 .then 回调中将数据分配给您的变量即可:

$scope.get_stats_quota_campagnes = function(passation){

    $http.post('backend/backend.php?action=stats_quota_campagnes',{'id_passation':passation.id_passation})
        .success(function(data){ 
            console.log(data);
            passation.stats_quota_campagnes = data;
        });
}

在您看来:

<tr ng-repeat="passation in passations">
    <td ng-init="get_stats_quota_campagnes(passation)">
        {{passation.stats_quota_campagnes}}
    </td>
</tr>

这不是它的工作原理。如果你想初始化 passation.stats_quota_campagnes 范围,你必须在控制器中调用服务,然后将结果分配给范围。

例如

angular.module('app')

    .controller('myController', ['$scope', 'myService', function ($scope, myService) {
        //...some other code in your controller.

        $scope.passation.stats_quota_campagnes  = [];

        $scope.get_stats_quota_campagnes = function (passation, index) {
            myService(passation).then(successCallback, failCallback);

            function successCallback(response) {
                $scope.passation[index].stats_quota_campagnes = response;
            };

            function failCallback(response) {
                //Do whatever you have to do.
            }
        };


        //This requires you have passation array initialized.
        angular.forEach(passation, function(val,index) {
            $scope.get_stats_quota_campagnes(val,index);
        });

    }])

    .service('myService', ['$http', '$q', function ($http, $q) {
        return function (passation) {

            var defer = $q.defer();
            $http.post('backend/backend.php?action=stats_quota_campagnes', {
                    'id_passation': passation.id_passation
                })
                .success(function (data) {
                    console.log(data);

                    defer.resolve(data);

                });
            return defer.promise;
        }

    }])

然后在视图中

<tr  ng-repeat="passation in passations" >
    <td>{{passation.stats_quota_campagnes}}</td>
</tr>