我创建了一个返回$http
承诺的工厂。
loginRsrc.factory('loginSrvc', ['$http', function($http){
var http = $http({
method: 'POST',
url: "http://myproj.herokuapp.com/api/signIn",
data: $.param({email: "joe@gmail.com", password: "1234567"}),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
return http;
我在控制器中使用这个工厂。但我的行为很有趣。
当我说
时loginSrvc()
.success(function(res){
console.log("res:");
console.log(res);
})
.error(function(res){
console.log("res");
console.log(res);
});
我收到TypeError: object is not a function
。
但是当我说(省略括号)时
loginSrvc
.success(function(res){
console.log("res:");
console.log(res);
})
.error(function(res){
console.log("res");
console.log(res);
});
效果很好!成功打印到控制台。
我无法理解这种奇怪的行为。只需添加success
函数即可调用$http
个活动?
这是我的完全控制者:
loginApp.controller('loginCtrl', ['$scope', '$state', 'loginSrvc', function($scope, $state, loginSrvc){
$scope.loginForm = {};
$scope.loginForm.email = "";
$scope.loginForm.password = "";
$scope.submit = function(){
loginSrvc
.success(function(res){
console.log("res:");
console.log(res);
})
.error(function(res){
console.log("res");
console.log(res);
});
}
}])
答案 0 :(得分:3)
因为您的服务已经返回了已调用的$http
服务,因此无需再次从控制器调用它。承诺已经可以使用。
更好的模式是使用ngResource
,这样您就可以为每个API端点使用各自的promise来抽象处理程序。
答案 1 :(得分:1)
没有括号的传递是因为loginSrvc
是一个对象而不是一个函数。
Factory API实例化Object
因为,您试图将Object作为函数调用,这就是您遇到错误的原因:
TypeError: object is not a function