AngularJS 控制器和工厂

AngularJS Controller and Factory

在过去的几天里,我花了很多时间 AngularJS,它现在开始全部点击 :) 但我似乎无法回答的一个问题是我如何获得我的工厂将 return 数据作为 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;
            });

        });
    }());

promises 的全部意义在于您不能立即获得异步操作的结果。

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

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

直接绑定到 promise 在 angular 的早期版本中有效,但他们去掉了这个功能(我不完全知道为什么)所以,是的,只要坚持使用 'then()'在控制器中。

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

(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() {});
    }());

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

还是那句话,要看你最终想达到什么目的。你可以妥协并拥有一个更轻的控制器,但你可能会冒着无法及时获取数据的风险(如果你有很多订单)。只要它们能正常工作并且编写正确,我就不会对几行额外的代码强调太多。

希望这些信息对您有所帮助。

祝你好运!