我创建了一个工厂来检索客户:
customerModule.factory("CustomerFactory", ["$http", "DataService", function ($http, dataService) {
var self = this;
self.page = 1;
self.query = "";
var queryFn = function (query) {
self.query = query;
$http.get(dataService.baseURI + "/customers", {
params: {
query: self.query,
page: self.page,
pageSize: 50
}
}).success(function (data) {
return data.result;
});
};
return {
query: queryFn
};
}]);
但是当我在我的控制器中使用它时,它返回undefined
,我不确定我在这里做错了什么?
$scope.$watch("query", function () {
if ($scope.query && $scope.query.length > 3) {
console.log(customerFactory.query($scope.query));
}
else if ($scope.query.length < 4) {
$scope.customers = [];
}
});
答案 0 :(得分:1)
如果你仔细查看queryFn
功能,你会注意到你实际上并没有返回任何内容。这意味着queryFn
将返回undefined
。
修复代码的第一步是将return
放在$http
前面。
第二步是确定调用customerFactory.query
函数的方式。您希望它立即返回值,但$ http实际上会创建一个XHR请求,默认情况下XHR请求是异步的,因此您不能指望customerFactory.query
立即返回结果。
如果您还没有学会承诺,那么现在是时候看看它们了,因为它们在角落世界中被广泛使用。
假设您已将return
放在$ http之前,对customerFactory.query
的调用实际上将返回一个promise对象。该promise对象具有.then
方法。此方法应用作:
customerFactory.query($scope.query)
.then(function(customers){
console.log(customers);
});