【问题标题】:How to get the http request data in my example?如何在我的示例中获取 http 请求数据?
【发布时间】:2014-11-02 11:06:58
【问题描述】:

我正在尝试在我的第一个控制器中获取 http 请求结果。 http 请求由另一个控制器触发。我遇到的问题是我不确定如何检测请求是否在我的第一个控制器中完成。我有类似的东西

第一个控制器:

//I am not sure how to get the customer result if
//http requests are trigger by another controllers here.

customerFactory.getCustomerResult????

第二控制器:

//trigger the http request..
var id = 1;
$scope.clickme = function() {
    var obj = customerFactory.callApi(id)
}

我的工厂

customerFactory.callApi = function(id) {
    return getCustomer(id)
        .then(function(customer) {
            return customer;    

         })  
}

var getCustomer = function(id) {
    return $http.get('/api/project1/getCustomer' + id);
}

return customerFactory;

html

<div ng-controller="firstCtrl">
    //codes...
</div>

//other codes..
//other codes..

<div ng-controller="secondCtrl">
    //codes...
</div>

第一个和第二个控制器不相关。他们彼此相距很远。如何让 firstCtrl 检测到 http 请求是否完成并获取客户数据?非常感谢!

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您可以使用作为单例的工厂或服务来负责发出请求和存储数据。服务和工厂都是单例,因此单个实​​例持续存在以执行应用程序,并且可以通过注入工厂或服务从控制器中引用数据和函数(这两种方法都是在之前配置时使用更简洁的语法定义提供者的方法不需要通过提供商使用服务/工厂)。

    angular.module("exampleApp", []).service('ExampleService', ["$http", "$q" ,function ($http, $q) {
        var service = {
            returnedData: [],
            dataLoaded:{},
            getData = function(forceRefresh)
            {
                var deferred = $q.defer();
    
                if(!service.dataLoaded.genericData || forceRefresh)
                {
                    $http.get("php/getSomeData.php").success(function(data){
                        angular.copy(data, service.returnedData)
                        service.dataLoaded.genericData = true;
                        deferred.resolve(service.returnedData);
                    });
                }
                else
                {
                    deferred.resolve(service.returnedData);
                }
    
                return deferred.promise;
            },
            addSomeData:function(someDataToAdd)
            {
                $http.post("php/addSomeData.php", someDataToAdd).success(function(data){
                    service.getData(true);
                });
            }
        };
        return service;
    }]).controller("ExampleCtrl", ["$scope", "ExampleService", function($scope, ExampleService){
      $scope.ExampleService = ExampleService;
    }]).controller("ExampleCtrl2", ["$scope", "ExampleService", function($scope, ExampleService){
      ExampleService.getData();
      $scope.ExampleService = ExampleService;
    }]);
    

    【讨论】:

    • 感谢 shaunhusain,您的示例显示一个控制器调用 ExampleService.getData 但它如何将返回数据传递给另一个控制器? +1
    • 刚刚编辑以显示第二个控制器,它与第一个控制器相同,我正在做的和你正在做的唯一真正的区别是我也在服务中存储数据( factory 也很好),因此可以从两个地方引用它。有一些选择,但通常这是我遇到的最好的方法。同样公平地说,我从其他答案中获取了我的代码,但我已经多次遇到这个问题并将人们推荐给其他帖子stackoverflow.com/questions/17667455/…
    • 感谢您的帮助!我的问题是我需要在 ExampleCtrl 中触发 http 请求,但让 ExampleCtrl2 获取数据。如果我理解正确,ExampleCtrl2 也需要调用 getData 来获取数据。我只希望 ExampleCtrl 调用 getData 方法。
    • 不,你可以从任何一个调用它,这里的 ExampleService 只是一个没有重新创建的对象,所以第一次引用它时,它会被创建,之后对它的所有其他引用都使用第一个对象。因此,您可以将服务注入两个控制器并仅在一个控制器中调用服务上的方法,但是通过服务从第二个控制器引用的数据的更改将指向两个控制器中的相同数据对象。这里的重点是我使用 angular.copy 来填充所述数据对象,而不是更改引用的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2022-12-19
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多