AngularJS控制器和工厂

时间:2015-04-03 11:57:02

标签: angularjs factory

过去几天我花了很多时间浏览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;
            });

        });
    }());

3 个答案:

答案 0 :(得分:2)

承诺的重点是你不能立即获得异步操作的结果。

所以是的,您应该使用then来获得最终结果。这是三行而不是一行,但这不应该是一个问题。一旦你习惯了使用承诺,我相信你不会认为这是一件大事。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

同样,这取决于你最终想要达到的目标。您可以妥协并拥有更轻的控制器,但您可能无法及时获取所获取的数据(如果您有大量订单)。只要他们正在完成自己的工作并且写得正确,我就不会在几行代码上施加太多压力。

希望这些信息有所帮助。

祝你好运!