【问题标题】:AngularJS Controller and FactoryAngularJS 控制器和工厂
【发布时间】:2015-04-03 11:57:02
【问题描述】:

在过去的几天里,我花了很多时间研究 AngularJS,它现在开始全部点击 :) 但我似乎无法回答的一个问题是我如何让我的工厂以 JSON 格式返回数据- 不是承诺,或者即使我应该这样做!

有几个原因我看不到结果,A) 承诺不完整,B) 我不应该这样做,实际上应该坚持使用控制器中的“then()”。理想情况下,我想在控制器中写一行,但除非我遵循示例中的模式,否则我总是得到一个未定义的。

我是否在我不需要的地方违背了这一点?

    //  Will go into application.js
    (function () {
        var app = angular.module("ngOrderApp", []);
    }());

    //  Will go into orderFactory.js
    (function () {
        var order = function ($http) {
            var getOrdersJson = function () {
                return [{ OrderId: 101 }, { OrderId: 102 }, { OrderId: 103 }]; 
            }
            var getOrdershttp = function () {
                return $http.get('api/order')
                  .success(function (result) {
                      return result.data;
                  });
            }
            return {
                getOrdersJson: getOrdersJson,
                getOrdershttp: getOrdershttp
            };
        }
        var app = angular.module("ngOrderApp").factory("order", order);
    }());

    //  Will go into orderController.js
    (function () {
        var app = angular.module("ngOrderApp").controller('OrderController', function ($scope, order) {

            $scope.jsonorders = order.getOrdersJson();

            order.getOrdershttp().then(function (result) {
                $scope.httporders = result.data;
            });

        });
    }());

【问题讨论】:

    标签: angularjs factory


    【解决方案1】:

    promise 的全部意义在于您无法立即获得异步操作的结果。

    所以是的,您应该使用then 来获得最终结果。它是三行而不是一行,但这应该不是问题。一旦你习惯了使用 Promise,我相信你不会觉得它有什么大不了的。

    如果这真的不适合您,您可以考虑使用$resource 而不是直接使用$http。这实质上允许您将值直接分配给您想要的位置,而不是使用then,并且它的其余内容将在请求最终完成时(异步)填充。请记住,这仍然不允许您立即访问结果值。当您使用异步时,这是不可能的。

    【讨论】:

    • 太棒了,目前也在研究这个。为指针干杯:)
    【解决方案2】:

    直接绑定到一个 Promise 在以前的 Angular 版本中有效,但他们摆脱了这个功能(我不知道为什么)所以,是的,只需在控制器中坚持使用 'then()'。

    【讨论】:

      【解决方案3】:

      这取决于您要获取的数据。您可以在工厂中进行预取并将数据存储到私有变量中,如下所示:

      (function () {
              var order = function ($http) {
                  var getOrdersJson = function () {
                      return [{ OrderId: 101 }, { OrderId: 102 }, { OrderId: 103 }]; 
                  }
                  var getOrdershttp = function () {
                      return $http.get('api/order')
                        .success(function (result) {
                            return result.data;
                        });
                  }
      
                  var orders = [];
                  getOrdershttp().then(function(res) {
                     orders = res.data;
                  });
      
                  function getCahcedOrders(){ return orders; };
      
                  return {
                      getOrdersJson: getOrdersJson,
                      getOrdershttp: getOrdershttp,
                      getChacedOrders: getChacedOrders
                  };
              }
              var app = angular.module("ngOrderApp").factory("order", order);
          }());
      

      这样你的控制器将只包含:

      $scope.orders = order.getCachedOrders();
      

      这只是摆脱.then() 的另一种方法,但只有当您确定只需要一次获取这些订单时,您才能执行此操作。否则,您需要兑现承诺。 另外如果您想采用这种方法,您需要在您的应用加注星标时预取您的订单,如下所示:

      (function () {
              var app = angular.module("ngOrderApp", []);
      
              app.run(['order'], function() {});
          }());
      

      因此,您有某种保证,当您尝试访问它们时,您的订单将被加载。 run 函数在您的 Angular 应用程序启动时运行,因此如果您在那里加载您的工厂,$http 将开始获取您的数据并填充 orders 数组,以便您可以在您的应用程序。

      同样,这取决于您最终想要实现什么。您可以妥协并拥有一个更轻的控制器,但您可能无法及时获取获取的数据(如果您有很多订单)。只要他们在做他们的工作并且编写正确,我就不会对额外的几行代码有太大压力。

      希望这些信息有所帮助。

      祝你好运!

      【讨论】:

      • 干杯 Andrei,我确实想了很多,但来自 C# 和 OOP,让我的大脑了解事情应该如何是当务之急。这有帮助。干杯。
      • 我知道那种感觉 :)。没问题,很高兴我能提供帮助!
      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多