【问题标题】:can't return obj from angular factory无法从角度工厂返回 obj
【发布时间】:2016-06-18 09:13:04
【问题描述】:

这是我的工厂服务。

(function() {
    var appfactory = angular.module("RoyalApp");
    appfactory.factory('packService', packService);

    packService.$inject = ['varsService', '$http'];

    function packService(varsService, $http) {

        var packages = {

            getPackages: function() {
                $http({
                    method: "GET",
                    url: "http://localhost:63666/api/Package?customer_id=" + varsService.dataObj._id
                }).then(function mySuccess(response) {
                    return response.data;
                }, function myError(response) {

                });
            }
        }
        return packages;
    }
})();

在我的控制器中,我使用它来将它们存储在控制器范围内

var vm = this;
vm.packages = packService.packages.getPackages;

也试过了

vm.packages = packService.packages.getPackages();

我在 chrome 控制台中没有错误,我的 http 响应是正确的。我根本无法返回响应。

【问题讨论】:

    标签: angularjs factory


    【解决方案1】:

    应该是:

    packService.getPackages().then(function(packages) {
        vm.packages = packages;
    });
    

    注意getPackages必须返回promise:

    getPackages: function() {
        return $http({
            method: "GET",
            url: "http://localhost:63666/api/Package?customer_id=" + varsService.dataObj._id
        }).then(function mySuccess(response) {
            return response.data;
        }, function myError(response) {
    
        });
    }
    

    几个笔记。 packService 的公共 API 包含单个方法 getPackages - 这是您需要调用的。然后它返回一个 promise 对象,您可以使用该对象提供一个回调(使用 then 方法),以便在加载数据时调用。

    【讨论】:

    • 我试过没用,也许我错过了什么。感谢您花时间。在继续之前,我正在考虑暂停我的应用程序以对工厂和服务进行一些研究。
    • 我添加了一个我在控制器中具有的功能(具有不同的范围变量)。出于某种原因,我想从服务中获取数据,而不是从控制器内部的 http 调用中获取数据。所以当我在服务中转移我的函数时,即使我的 http 调用正在工作,我也无法将服务中的响应传递给我可以在我的控制器中读取的变量。也许我接近洞的方式是错误的。
    • 发布失败的代码。我给了你一个解决方案应该怎么做。直接从控制器发出 http 请求不是一个好主意,应该避免。不要放弃,设置一个最小的演示:plnkr.co/edit/vAHi03zzqYUO4eGwxUOU 这样可以提供帮助,这很简单。
    • 短暂休息后我再次开始项目。我根据你的回答重写了我的控制器和工厂,我终于设法让它工作了。谢谢大家的时间。
    • 很高兴你知道了。随意接受答案并关闭线程。
    【解决方案2】:

    控制器

    angular.module('myApp', [])
          .controller('MyCtrl', ['$scope' 'packService', function($scope, packService){
              var vm = this;
              packService.getPackages().then(function(packages) {
                vm.packages = packages;
              });
          }]);
    

    【讨论】:

      【解决方案3】:

      您不应该将名称放在匿名函数委托中。删除 'mySuccess' 和 'myError' 并重试(不要忘记在您的控制器中将返回作为承诺处理,如我之前的答案中所述)。

      getPackages: function() {
                  $http({
                      method: "GET",
                      url: "http://localhost:63666/api/Package?customer_id=" + varsService.dataObj._id
                  }).then(function (response) {
                      return response.data;
                  }, function (response) {
      
                  });
              }
      

      【讨论】:

        猜你喜欢
        • 2016-07-20
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多