【问题标题】:AngularJS child $http.post from template ng-repeat来自模板 ng-repeat 的 AngularJS 子 $http.post
【发布时间】:2015-03-06 05:40:21
【问题描述】:

在我的 AngularJS 应用程序中,我在控制器上使用 $http.post(我正在使用 json rpc API)获取数据,然后使用

渲染此数据(项目数组)
<div ng-repeat="item in arrayItems">
    {{ makeANewHttpRequest(item.relatedItemId).propertyName }}
</div>

我需要实现 $scope.makeANewHttpRequest(itemId) 函数,它调用的次数与 arrayItems.length 一样多,并从新的 $http.post 请求中返回相关项对象。

我该怎么做? 这是一个好习惯吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    首先你需要创建一个工厂来负责$http.post 已经暴露给其他人的调用,它会返回promise 对象。您可以通过添加dataService factory 作为对控制器依赖项的引用来调用该服务方法。控制器将调用dataService.getData(url, data) 之类的服务函数,并在每个已解决的承诺上增加计数器,更新数据,然后如果arrayItems 计数未超过计数器,则调用下一篇文章。

    工厂

    var myModule = angular.module('myModule', []);
    myModule.factory('dataService', function($http) {
        var getData = function(url, data) {
            return $http.post(url, {
                data
            }).then(function(res) {
                return res.data;
            });
        };
    
        return {
            getData: getData
        }
    });
    

    控制器

    myModule.controller('mainCtrl', function($scope, dataService) {
        //other code
        $scope.counter = 0;
        $scope.makeANewHttpRequest = function(id) {
            dataService.getData(url+id, data).then(function(data) {
                $scope.data = data; //updated the data each time when response received
                ++$scope.counter; //increment counter
                if ($scope.counter >= $scope.arrayItems.length) //check counter should not exceed limit
                    $scope.makeANewHttpRequest(id);
            });
        }
    });
    

    HTML

    ng-click="counter=0;$scope.makeANewHttpRequest(id)" //clear count and call method
    

    希望对你有帮助,谢谢。

    【讨论】:

    • @Fabrizio A 你还需要我做些什么吗?
    • 您好,抱歉耽搁了。我对 Angular 比较陌生,我读过 $q 对象。现在我已经通过不同的 API 使用解决了我的问题......但你的解决方案似乎很优雅,我正在研究它以解决另一个类似的问题。我需要创建我的第一个服务来获取对象数组(带有 $http.post)并将其返回给我的控件以填充 ngTable。由于 Angular 中的所有服务都是单例的,因此我很想缓存检索到的数据,以便将来刷新同一控制器。
    • @FabrizioA 你能分享你尝试过的任何东西吗..& 你需要我的帮助吗?
    • 你可以看看这里 ;) 谢谢! stackoverflow.com/questions/28963955/…
    【解决方案2】:

    首先,我认为正确的方法是在您执行第一个 http 请求时生成服务器中所需的所有数据。这将为您节省您必须为数组中的每个项目执行的所有额外发布请求。如果必须这样做,那么正确的方法是在获取数据后在控制器中处理对 makeANewHttpRequest 的调用。

    $http.post('/someUrl').
      success(function(data, status, headers, config) {
       //do the new http requests here
       var promiseArr = []
       angular.forEach(data, function(val) {
         promiseArr.push(makeANewHttpRequest(val));
       });
       $q.all(promiseArr).then(function(updatedValues) {
           for (var i = 0; i < data.length; i++) {
               data[i].relatedItemId = updatedValues[i];
           }
           $scope.arrayItems = data;
       });
    });
    
    function makeANewHttpRequest(item) {
        return $http.post('/someUrl', item.relatedItemId);
    }
    

    【讨论】:

    • 你在哪里维护了范围变量的承诺和更新?
    • 更新了上述内容以减少模糊性。还使用了 $q.all 以便仅在所需的所有数据可用后才分配 arrayItems。
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多