过去几天我花了很多时间浏览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;
});
});
}());
答案 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将开始获取您的数据并填充订单数组,以便您可以在应用
同样,这取决于你最终想要达到的目标。您可以妥协并拥有更轻的控制器,但您可能无法及时获取所获取的数据(如果您有大量订单)。只要他们正在完成自己的工作并且写得正确,我就不会在几行代码上施加太多压力。
希望这些信息有所帮助。
祝你好运!